我一直在寻找在磁盘上随机播放文件而不加载到内存中的想法。一开始,我怀疑这种方法存在,但最近我遇到了这个answer。由于这个答案不受支持或投票,我很想知道这段代码是否确实在没有加载到内存中的情况下改组文件。如果是这样,那会发生什么?我没有看到如何在不将文件首先加载到内存中的情况下进行混洗!
答案 0 :(得分:4)
我假设你正在谈论在文本文件中改组行。
我不知道Jamie Cockburn的相关答案是否有效,但对我来说这看起来完全合情合理。这个想法如下:
mmap
不会将整个文件加载到内存中,但允许您通过"从"索引来访问其随机部分。和"到" bytes,好像它是一个加载到内存中的列表\n
并且不存储该行,而是存储与每行开头和结尾的地址对应的字节数(或索引)。您有效地存储每行两个数字lines
的索引列表(请记住,它只包含对(int, int)
)data[start:end+1]
到内存中并将其写入新文件。您不会将该行保留在内存中的时间超过此单个操作。此方法需要输入文件中行数的线性内存量。如果平均行长度大于存储两个整数所需的内存量,它可能比读取整个文件小得多。