【发布时间】:2019-06-27 15:18:46
【问题描述】:
我需要以最高效、最快速的方式处理大量文件。
读取 -> 处理 -> 写入(保存到同一位置)。
我的问题是我的实现很慢,至少我是这么认为的。处理600000个文件花了我半个晚上左右的时间。
我故意以同步方式完成,如果异步方式可以做得更好 - 我愿意接受解决方案,我只是不认为处理大量仅重 1-3kb 的文件会花费那么长时间.
文件有简单的 JSON 数据,每个文件大约 1-3kb 大小,就像我已经说过的那样。
这些文件位于单独的文件夹中,每个文件夹包含 300 个文件。我将它们分开是为了使其更高效和可用。
所以我们有大约 2000 个文件夹,每个文件夹有 300 个文件(1-3kb 大小)。
看看我的代码,给我你的想法。谢谢!
function test() {
/**
* Get list of folders and loop through
*/
const folderList = fs.readdirSync(`../db`)
for (const folder of folderList) {
/**
* Get list of files for each folder and loop through
*/
const fileList = fs.readdirSync(`../db/${ folder }`)
for (const filePath of fileList) {
/**
* try/catch block to handle JSON.parse errors
*/
try {
/**
* Read file
*/
const file = JSON.parse(fs.readFileSync(`../db/${ folder }/${ filePath }`))
/**
* Process file
*/
processFile(file)
/**
* Write file
*/
fs.writeFileSync(`../db/${ folder }/${ filePath }`, JSON.stringify(file), 'utf8')
} catch (err) {
console.log(err)
}
}
}
}
我希望它运行得相当快,实际上这需要一段时间。
【问题讨论】:
-
所有操作都是同步的。这是故意的吗?
-
几个想法:您正在使用同步/阻塞调用来读取和写入文件;通过在此处使用异步/非阻塞调用,您可以看到一些改进;但是并行操作的数量会有一个最佳点;例如也许同时运行 10 次迭代会有所帮助,但 10,000 次可能会产生不利影响,因此您必须尝试:github.com/feross/run-parallel-limit。此外,您的
processFile是不透明的。里面发生了什么?如果这是一个 CPU 密集型任务,您可以在工作线程中运行它。 nodejs.org/api/worker_threads.html -
这个问题可能更适合codereview.stackexchange.com,因为您正在寻找工作代码的改进:)
-
我还注意到,如果我运行一次脚本,如果我停止它并再次运行,它将快速循环遍历已经处理的文件(尽管我们处理它们而不是跳过),当它涉及我们停止的数字 - 它再次开始减速。
-
@Boaz 是的,但我愿意尝试异步方式。我只是没想到处理小 JSON 对象可能需要那么长时间。
标签: javascript node.js fs