在 Node.js 上对 RAM 较低的大文件进行排序

Dan*_*hin 4 javascript sorting fs node.js

我们有 500GB 的文件,其中包含整数行。我们如何使用 Node.js 仅用 512Mb RAM 对其进行排序?我想是这样的:

  1. 将主文件分成 256Mb 块
  2. 对每个块进行排序
  3. 获取每个块的第一行,排序并将其推送到最终文件
  4. 对块中的每一行执行第三步。

一些想法?

更新: 感谢用户some-random-it-boy 这个解决方案基于具有本机排序实用程序的子进程。我认为它应该有效)

var fs = require('fs'),
    spawn = require('child_process').spawn,
    sort = spawn('sort', ['in.txt']);

var writer = fs.createWriteStream('out.txt');

sort.stdout.on('data', function (data) {
  writer.write(data)
});

sort.on('exit', function (code) {
  if (code) console.log(code); //if some error
  writer.end();
});
Run Code Online (Sandbox Code Playgroud)

Som*_*boy 5

我讨厌为 js 问题提供非 js 解决方案。但既然您使用的是节点环境,为什么不将此任务委托给专门为此设计的流程呢?

使用您的包child-process,使用您需要的任何参数调用sort此处的文档)命令。

引用这个答案

根据sort使用的算法,它将根据可用内存来使用内存:TotalMem/8和AvailableMem之间最大数的一半。例如,如果您有 4 GB 可用内存(8 GB 中),则排序将使用 2 GB RAM。它还应该在 /bigdisk 中创建许多 2 GB 文件,最后对它们进行合并排序。

这本质上就是您建议做的事情,已经实现并在裸硬件上以 C 语言运行,中间没有任何解释器。我想在你的限制范围内你不可能比这更快了:)