我有一个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。
考虑到文件大小>可用内存,我意识到这可能是一项非常复杂的任务。
如果有人对这个问题有任何想法或潜在的解决方案,将不胜感激!提前非常感谢!
答案 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