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

问题描述 投票:2回答:1

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

python python-2.7 numpy
1个回答
4
投票

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.