2011-03-30 33 views
5

我读过mmap比fileinput更有优势,因为它会将页面读入内核pagecache并在用户地址空间中共享页面。而fileinput实际上会将页面带入内核,并将行复制到用户地址空间。所以,fileinput有额外的空间开销。mmap vs fileinput的优点

因此,我打算迁移到mmap,但我想从高级python黑客知道它是否会提高性能?

如果是这样,是否有使用mmap的fileinput的类似实现?

如果您知道的话,请指点我的任何开源代码。

谢谢

回答

1

MMAP需要一个文件,并把它插在RAM中,这样你可以索引它像一个字节数组或者作为一个大的数据结构。

如果您以“随机访问”方式访问文件,这会执行很多fseek(),fread(),fwrite()组合。

但是,如果您只是读取文件并处理每一行一次(说),那么它不可能明显更快。实际上,对于任何合理的文件大小(记住使用mmap都必须适合内存 - 或者发生分页开始降低mmap的效率),它可能是无法区分的。

+9

这是不正确的。 mmap:ed文件不需要放入RAM中 - 它们需要适合进程地址空间。可用的地址空间对于32位处理为2-3 GB,对于64位处理非常大,与机器中实际的RAM数量无关。在一个64位的Python上,mmap一个100 GB的文件是完全合理的! – 2011-03-31 22:29:10

+1

Baffe,没错,你是对的,我的意思是“这一切都必须适合内存,以避免你首先使用mmap避免的低效率”。这当然有点简化,但请合理我在这里给经验法则不是一个关于算法中的本地化分析的完整论文 – AndrewStone 2011-04-01 00:12:57

+3

我不太确定你的意思是什么效率低下。 mmap:文件不会从磁盘读取整个文件。只读取您从mmap返回的对象实际访问的文件部分。 – 2011-04-01 23:21:46