Wie schnell ist fs.readdirSync? Kann ich es beschleunigen?
P粉064448449
2023-09-04 19:48:56
<p>Ich habe eine Funktion, die mithilfe von fs.readdirSync rekursiv alle Dateien in einem Verzeichnis abruft.
Mit dem kleinen Verzeichnis hat es gut funktioniert. Ich habe es als Test ausgeführt, aber jetzt führe ich es in einem Verzeichnis aus, das über 100 GB groß ist, und es dauert lange, bis es fertig ist. Irgendwelche Ideen, wie man das beschleunigen kann oder ob es einen besseren Weg gibt? Irgendwann muss ich das bei einigen Verzeichnissen ausführen, die Terabytes an Daten enthalten. </p>
<pre class="brush:php;toolbar:false;">// Rekursive Funktion zum Abrufen von Dateien
Funktion getFiles(dir, files = []) {
// Mit fs.readdirSync ein Array aller Dateien und Verzeichnisse im übergebenen Verzeichnis abrufen
const fileList = fs.readdirSync(dir);
// Erstelle den vollständigen Pfad der Datei/des Verzeichnisses, indem du das übergebene Verzeichnis und den Datei-/Verzeichnisnamen verkettest
for (const-Datei von fileList) {
const name = `${dir}/${file}`;
// Überprüfen Sie mithilfe von fs.statSync, ob die aktuelle Datei/das aktuelle Verzeichnis ein Verzeichnis ist
if (fs.statSync(name).isDirectory()) {
// Wenn es sich um ein Verzeichnis handelt, rufen Sie rekursiv die Funktion getFiles mit dem Verzeichnispfad und dem Dateiarray auf
getFiles(name, files);
} anders {
// Wenn es sich um eine Datei handelt, den vollständigen Pfad zum Dateiarray übertragen
files.push(name);
}
}
Rückgabedateien;
}</pre></p>
不幸的是,
异步
速度较慢。所以我们需要优化你的代码。您可以使用{withFileTypes:true}
选项来完成此操作,速度提高 2 倍。我还尝试过节点 v20 的
{recursive:true}
选项,但它甚至比您的解决方案还要慢。它不适用于withFileTypes
。也许具有高读取速度的更好 SSD 会有所帮助。虽然我猜文件条目是从文件系统索引读取的,但不确定硬件如何影响它。
输出: