gpt4 book ai didi

python - 当整个文件太大时如何在python中使用mmap

转载 作者:太空狗 更新时间:2023-10-29 17:12:01 28 4
gpt4 key购买 nike

我有一个 python 脚本,它逐行读取文件并查看每一行是否与正则表达式匹配。

我想通过在搜索之前使用内存映射文件来提高该脚本的性能。我查看了 mmap 示例:http://docs.python.org/2/library/mmap.html

我的问题是,当文件太大 (15GB) 对于我的机器内存 (4GB) 而言,我如何映射文件

我是这样读文件的:

fi = open(log_file, 'r', buffering=10*1024*1024)

for line in fi:
//do somemthong

fi.close()

由于我将缓冲区设置为 10MB,就性能而言,它是否与我映射 10MB 的文件相同?

谢谢。

最佳答案

首先,你机器的内存是无关紧要的。它是您进程的 address space 的大小那是相关的。对于 32 位 Python,这将低于 4GB。使用 64 位 Python,这将绰绰有余。

原因是mmapmapping a file 无关进入物理内存,但进入virtual memory . mmapped 文件就像您程序的特殊交换文件一样。考虑这个问题可能会有点复杂,但上面的维基百科链接应该会有所帮助。

所以,第一个答案是“使用 64 位 Python”。但显然这可能不适用于您的情况。

明显的替代方法是在前 1GB 中映射,搜索,取消映射,在下一个 1GB 中映射,等等。您执行此操作的方法是指定 lengthoffset mmap 方法的参数。例如:

m = mmap.mmap(f.fileno(), length=1024*1024*1024, offset=1536*1024*1024)

但是,您要搜索的正则表达式可能会在前 1GB 的中途找到,在第二个 1GB 的一半中找到。因此,您需要使用窗口化 — 在前 1GB 中映射、搜索、取消映射,然后在部分重叠的 1GB 中映射,等等。

问题是,您需要多少重叠?如果您知道一场比赛的最大可能规模,那么您不需要任何其他东西。如果您不知道……好吧,那么如果不分解您的正则表达式就无法真正解决问题——如果这不是很明显,想象一下您如何可能在一个 1GB 的窗口中找到 2GB 的匹配项。

回答您的后续问题:

Since I set the buffer to 10MB, in terms of performance, is it the same as I mmap 10MB of file?

对于任何性能问题,如果它真的很重要,您就需要对其进行测试,如果不重要,请不要担心。

如果你想让我猜:我认为 mmap 在这里可能更快,但这只是因为(正如 J.F. Sebastian 暗示的那样)循环和调用 re.match 128K 次通常可能会导致您的代码受 CPU 限制而不是 IO 限制。但是您可以在没有 mmap 的情况下优化它,只需使用 read。那么,mmap 会比 read 更快吗?考虑到所涉及的大小,我预计 mmap 的性能在旧 Unix 平台上会快得多,在现代 Unix 平台上大致相同,而在 Windows 上会慢一点。 (与 readread+lseek 如果您使用madvise,但这与此处无关。)但实际上,这只是一个猜测。

使用mmap 的最令人信服的理由通常是它比基于read 的代码更简单,而不是它更快。当您甚至必须使用 mmap 来使用窗口,并且您不需要使用 read 进行任何查找时,这就不那么吸引人了,但是,如果您尝试编写两种方式的代码,我希望您的 mmap 代码最终会更具可读性。 (特别是如果您尝试从明显的 read 解决方案中优化缓冲区副本。)

关于python - 当整个文件太大时如何在python中使用mmap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14289421/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com