我一直在寻找一种在磁盘上打乱文件而不将其加载到内存中的想法。一开始,我怀疑这种方法是否存在,但最近我遇到了这个answer 。由于这个答案不受支持或投票,我很想知道这段代码是否真的可以在不加载到内存的情况下对文件进行洗牌。如果是这样,那是怎么发生的?我不明白如何在不先将文件加载到内存的情况下对文件进行洗牌!
最佳答案
我假设您正在谈论文本文件中的随机行。
我不知道 Jamie Cockburn 的链接答案是否有效,但在我看来完全合理。想法如下:
mmap
不会将整个文件加载到内存中,但允许您通过“from”和“to”字节进行索引来访问其随机部分,就像它列表是否已加载到内存中- 您确实浏览了该文件两次,但并未将文件内容加载到内存中
- 第一次遍历文件时,请注意换行符
\n
,并且不存储该行,而是存储与每行的开始和结束地址相对应的字节号(或索引)。您可以有效地每行存储两个数字 - 现在,您可以对名为
lines
的索引列表进行洗牌(请记住,它仅包含对(int, int)
) - 现在打开一个新文件进行写入,并迭代打乱后的索引;对于每个索引对,您将原始文件中的一行
data[start:end+1]
读取到内存中,并将其写入新文件中。该行在内存中保留的时间不会超过此单个操作。
此方法需要与输入文件中的行数成线性关系的内存量。如果平均行长度大于存储两个整数所需的内存量,它可能比读取整个文件小得多。
关于python - 文件如何在磁盘上打乱而不加载到内存中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47983576/