当我想在 python 中读取内存中的二进制文件时,我只需这样做:
with open("file.bin","rb") as f:
contents = f.read()
对于“合理”大小的文件,这是完美的,但是当文件很大时(例如,1Gb 或更大),在监视进程时,我们注意到内存增加然后缩小,然后增加,...可能是这样的效果当原始内存块太小而无法容纳文件时,realloc
在幕后进行。
经过多次执行,此 realloc
+ memmove
操作会占用大量 CPU 时间。在 C 中,我不会遇到问题,因为我会将正确分配的缓冲区传递给 fread (但在这里我不能,因为 bytes
对象是不可变的,所以我无法预分配)。
当然,我可以像这样一 block 一 block 地阅读它:
with open("file.bin","rb") as f:
while True:
contents = f.read(CHUNK_SIZE)
if contents:
chunks.append(contents)
else:
break
但随后我必须加入
字节 block ,但这在某些时候也会占用所需内存的两倍,而且我可能负担不起。
有没有一种方法可以通过一次大内存分配来读取缓冲区中的大二进制文件,并且在 CPU 方面高效?
最佳答案
您可以使用os.open
方法,它基本上是POSIX系统调用open
的包装器。
import os
fd = os.open("file.bin", os.O_RDONLY | os.O_BINARY)
这会以 rb
模式打开文件。
os.open
返回一个没有read
方法的文件描述符。您必须一次读取 n
个字节:
data = os.read(fd, 100)
完成后,使用os.close
关闭文件:
os.close(fd)
您正在用 Python 读取文件,就像用 C 语言一样!
这里有一些有用的引用:
免责声明:根据我对 C 的 open
函数如何工作的了解,我相信这应该可以解决问题。
关于python - 读取大文件而不重新分配内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44802421/