python - 资源受限主机的排列限制

标签 python algorithm sed shuffle

我有一个很大的文本文件,大约 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/

相关文章:

algorithm - 有向图所有路径中的最小权重边

json - 范围匹配查找的数据结构

algorithm - 以数值方式求解具有二元变量的多元非线性方程组的最快方法是什么?

python - 删除小于前一个值的数值

linux - 在特定时间戳之间解析文件内容

python - 将 R 安装的库用于其他程序?

python - 导入错误 : No module named newspaper

python - 在Python中解析包含XML的ASCII文本文件

Python, MySQL _mysql_exceptions.ProgrammingError : (1064, '你的 SQL 语法有错误

bash - 你如何结合 2 awk 输出