文件如何在没有加载到内存中的情况下在磁盘上进行混洗

时间:2017-12-26 20:50:44

标签: python python-2.7 numpy

我一直在寻找在磁盘上随机播放文件而不加载到内存中的想法。一开始,我怀疑这种方法存在,但最近我遇到了这个answer。由于这个答案不受支持或投票,我很想知道这段代码是否确实在没有加载到内存中的情况下改组文件。如果是这样,那会发生什么?我没有看到如何在不将文件首先加载到内存中的情况下进行混洗!

1 个答案:

答案 0 :(得分:4)

我假设你正在谈论在文本文件中改组行。

我不知道Jamie Cockburn的相关答案是否有效,但对我来说这看起来完全合情合理。这个想法如下:

  • mmap不会将整个文件加载到内存中,但允许您通过"从"索引来访问其随机部分。和"到" bytes,好像它是一个加载到内存中的列表
  • 你确实在文件中翻了两次,但是你没有将文件的内容加载到内存中
  • 首次通过该文件时,请注意换行符\n并且不存储该行,而是存储与每行开头和结尾的地址对应的字节数(或索引)。您有效地存储每行两个数字
  • 您现在随机播放名为lines的索引列表(请记住,它只包含对(int, int)
  • 现在你打开一个新的文件进行编写,并遍历混洗的索引;对于每个索引对,您从原始文件中读取一行data[start:end+1]到内存中并将其写入新文件。您不会将该行保留在内存中的时间超过此单个操作。

此方法需要输入文件中行数的线性内存量。如果平均行长度大于存储两个整数所需的内存量,它可能比读取整个文件小得多。