我有一个大的文本文件,大约8gb,我需要随机和统一地洗牌它的行。我无法对文本文件进行分区,必须对整个文件执行shuffle-shuffling操作。
我遇到了gnushuf
浪费在资源有限的主机(1gb内存)上的限制,因此我正在探索有意保持在该主机能力范围内的替代方案。
我的一个想法是从[1..n]
创建一个Python(2.7.5)数字列表,其中n
是这个8gb文件中的行数-大约2500万行-随机排列列表,并遍历列表以获得要馈送到sed -n <line_index>p
的索引(或行号)。
Python对一个包含2500万个元素的列表进行排列的能力有限制吗如果索引在该范围内,那么sed
按索引有效拉出行的能力是否有限制?
在资源受限的主机上有没有更有效的方法来洗牌大文本文件行?
最佳答案
我想下面这样的方法可能行得通。
from random import shuffle
# ... rest of the code ...
lnPos = [f.tell()]
for l in f.readlines(): lnPos.append( f.tell() )
shuffle( lnPos )
# Now open a file to write and write the lines
for pos in lnPos:
f.seek(pos, 0)
fOut.write( f.readline() )
我没有检查语法错误,但我认为这可能只是工作。告诉我进展如何。:)