Quelle est la vitesse de fs.readdirSync ? Puis-je l'accélérer ?
P粉064448449
P粉064448449 2023-09-04 19:48:56
0
1
627
<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粉064448449
P粉064448449

répondre à tous(1)
P粉696146205

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
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal