簡體   English   中英

在 node.js 上用低 RAM 對大文件進行排序

[英]Sort huge file with low RAM on node.js

我們有 500GB 的文件,其中包含 integer 行。 我們如何使用 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();
});

我討厭為 js 問題提供非 js 解決方案。 但是,既然您使用的是節點環境,為什么不將此任務委托給專門為此設計的流程呢?

使用您的包child-process ,使用您需要的任何參數調用sort ( docs here ) 命令。

引用這個答案

根據 sort 使用的算法,它會根據可用的內容使用內存:TotalMem/8 和 AvailableMem 之間最大數字的一半。 因此,例如,如果您有 4 GB 的可用內存(8 GB 中), sort 將使用 2 GB 的 RAM。 它還應該在 /bigdisk 中創建許多 2 GB 文件,最后對它們進行合並排序。

這基本上是你建議做的,已經實現並且在裸硬件上運行的 C 中沒有任何解釋器。 我想在你的限制范圍內你不能比這更快:)

如果您的整數不是太大,您也可以嘗試將它們轉換為字符串,將它們與自定義比較器進行比較,然后再轉換回整數。
背景:JS 需要 64 位數字(例如整數),並為字符串使用一組 16 位無符號整數值的“元素”。 ( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures )

我不知道這是否真的對記憶有幫助,是否值得付出努力,但也許有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM