在巨大的ndjson文件(45 GB)中随机重新排列行

时间:2018-07-28 00:57:37

标签: json bash random

我有一个ndjson文件(每行一个有效的json),其中包含我要通过主题模型运行的信息。碰巧的是,此数据按用户a)和按时间b)排序,因此整个ndjson文件的结构远非随机。但是,为了通过主题模型推送此文件(以后我将其分块为n个较小的ndjson,每个50k行),我需要数据中出现的功能都具有在任何给定行中的相同可能性。我的想法是随机重新排序文件中的所有行。我正在使用的文件有 11502106行,并且文件总大小为45 GB。我还有文件的压缩版本,大约4 GB。

我解决此问题的想法是使用Ubuntu内置的shuf函数,提取与原始文件相同的行数,并将输出定向到新文件。我这样做是这样的:

nohup shuf -n 11502106 original_file.json > new_file_randomorder.json &

但是,此进程在运行大约2分钟后被系统杀死。 5分钟。我猜我内存不足(我的机器中有16 GB内存可用)。我正在运行Ubuntu 16.04。

考虑到文件大小>可用内存,我意识到这可能是一项非常复杂的任务。

如果有人对这个问题有任何想法或潜在的解决方案,将不胜感激!提前非常感谢!

2 个答案:

答案 0 :(得分:1)

GNU sort具有用于改组的-R选项。这可能很方便,但我相信它使用n * ln(n)算法。

在某些系统上,(或可以使)GNU排序为gsort

以下是使用55MB输入文件并包含15631278行的运行中的一些详细信息。时间以秒为单位。 -R选项限制使用RAM。

# /usr/bin/time -lp gsort -S 5M -R < input.txt > /tmp/shuffled.txt
user        98.45
sys          1.05
  14118912  maximum resident set size

答案 1 :(得分:0)

尝试terashuf-一个C ++应用程序。参见https://github.com/alexandres/terashuf