【问题标题】:Sort huge file with low RAM on node.js在 node.js 上对 RAM 低的大文件进行排序
【发布时间】:2020-12-22 02:27:13
【问题描述】:

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

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

一些想法?

更新: 感谢用户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();
});

【问题讨论】:

  • 您是否尝试过您首先描述的任何事情? Stack Overflow 更擅长解决特定的编程问题,而不是大型目标/项目。
  • 流不是节点的定义特征之一吗?你可以看看createReadStreamcreateWriteStream
  • @Sheraff 现在我正在使用 fs.openSyncfs.readSyncfs.writeSync,但无法理解这样做的算法

标签: javascript node.js sorting fs


【解决方案1】:

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

使用您的包child-process,使用您需要的任何参数调用sort (docs here) 命令。

引用this answer:

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

这基本上是您建议的,已经实现并且在 C 中运行在裸硬件上,中间没有任何解释器。我想你不能在你的限制范围内得到比这更快的速度:)

【讨论】:

  • 非常感谢!根据您对主线程的回答添加解决方案
【解决方案2】:

如果您的整数不是太大,您也可以尝试将它们转换为字符串,将它们与自定义比较器进行比较,然后再转换回整数。
背景:JS 需要数字(例如integers) 64 位,并为字符串使用一组 16 位无符号整数值的“元素”。 (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures)

我不知道这是否真的有助于记忆,是否 值得努力,但也许会有所帮助。

【讨论】:

    猜你喜欢
    • 2014-08-10
    • 2012-01-24
    • 1970-01-01
    • 1970-01-01
    • 2013-05-15
    • 2020-11-16
    • 1970-01-01
    • 1970-01-01
    • 2017-10-22
    相关资源
    最近更新 更多