recherche

Maison  >  Questions et réponses  >  le corps du texte

Quelle est la vitesse de fs.readdirSync ? Puis-je l'accélérer ?

<p>J'ai une fonction qui récupère de manière récursive tous les fichiers d'un répertoire en utilisant fs.readdirSync. Cela a bien fonctionné avec le petit répertoire. Je l'ai exécuté à titre de test, mais maintenant je l'exécute sur un répertoire de plus de 100 Go et cela prend beaucoup de temps. Avez-vous des idées sur la façon d'accélérer cela ou s'il existe un meilleur moyen ? Je devrai éventuellement l'exécuter sur certains répertoires contenant des téraoctets de données. </p> <pre class="brush:php;toolbar:false;">// Fonction récursive pour obtenir des fichiers fonction getFiles (rép, fichiers = []) { // Récupère un tableau de tous les fichiers et répertoires du répertoire transmis en utilisant fs.readdirSync const fileList = fs.readdirSync(dir); // Crée le chemin complet du fichier/répertoire en concaténant le répertoire passé et le nom du fichier/répertoire pour (fichier const de fileList) { const nom = `${dir}/${file}` ; // Vérifiez si le fichier/répertoire actuel est un répertoire utilisant fs.statSync if (fs.statSync(name).isDirectory()) { // S'il s'agit d'un répertoire, appelle récursivement la fonction getFiles avec le chemin du répertoire et le tableau files getFiles(nom, fichiers); } autre { // S'il s'agit d'un fichier, poussez le chemin complet vers le tableau files fichiers.push(nom); } } renvoyer des fichiers ; }</pre></p>
P粉064448449P粉064448449448 Il y a quelques jours611

répondre à tous(1)je répondrai

  • P粉696146205

    P粉6961462052023-09-05 18:06:04

    Malheureusement, l'option 异步速度较慢。所以我们需要优化你的代码。您可以使用 {withFileTypes:true} pour ce faire est 2x plus rapide.

    J'ai aussi essayé {recursive:true} 选项,但它甚至比您的解决方案还要慢。它不适用于 withFileTypes avec le nœud v20.

    Peut-être qu'un meilleur SSD avec une vitesse de lecture élevée serait utile. Bien que je suppose que les entrées de fichier sont lues à partir de l'index du système de fichiers, je ne sais pas comment le matériel affecte cela.

    import fs from 'fs';
    
    const DIR = '/bytex';
    
    function getFiles(dir, files = []) {
        // Get an array of all files and directories in the passed directory using fs.readdirSync
        const fileList = fs.readdirSync(dir);
        // Create the full path of the file/directory by concatenating the passed directory and file/directory name
        for (const file of fileList) {
            const name = `${dir}/${file}`;
            // Check if the current file/directory is a directory using fs.statSync
            if (fs.statSync(name).isDirectory()) {
                // If it is a directory, recursively call the getFiles function with the directory path and the files array
                getFiles(name, files);
            } else {
                // If it is a file, push the full path to the files array
                files.push(name);
            }
        }
        return files;
    }
    
    function getFiles2(dir, files = []) {
        const fileList = fs.readdirSync(dir, { withFileTypes: true });
        fileList.forEach(file => file.isDirectory() ? getFiles2(`${dir}/${file.name}`, files) : files.push(`${dir}/${file.name}`));
        return files;
    }
    
    let start = performance.now();
    let files = getFiles(DIR);
    console.log(performance.now() - start);
    console.log(files.length);
    
    start = performance.now();
    files = getFiles2(DIR);
    console.log(performance.now() - start);
    console.log(files.length);

    Sortie :

    171.66947209835052
    64508
    68.24071204662323
    64508

    répondre
    0
  • Annulerrépondre