我有一个很大的文本文件,大约 8 GB,我需要随机均匀地洗牌。我无法对文本文件进行分区和随机播放 — 必须对整个文件进行随机播放。
我遇到了 GNU shuf
的限制在资源有限的主机(1 GB 内存)上浪费时间,因此我正在探索有意保持在该主机能力范围内的替代方案。
我的一个想法是从 [1..n]
构建一个 Python (2.7.5) 数字列表, 其中n
是这个 8 GB 文件中的行数——大约 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() )
我还没有检查语法错误,但我认为这可能会奏效。让我知道事情的后续。 :)
关于python - 资源受限主机的排列限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21792183/