当我想在python中读取内存中的二进制文件时,我只是这样做:
with open("file.bin","rb") as f:
contents = f.read()
"合理"大小文件,它是完美的,但是当文件很大(比如1Gb或更多)时,在监视进程时,我们注意到内存增加然后收缩,然后增加,......可能是{{{ 1}}在幕后,当原始内存块太小而无法容纳文件时。
多次完成,此realloc
+ realloc
操作会占用大量CPU时间。在C中,我不会遇到问题,因为我会将正确分配的缓冲区传递给memmove
(但在这里我不能因为fread
对象是不可变的,所以我不能预先分配)。
当然,我可以通过像这样的块来读它:
bytes
然后我必须with open("file.bin","rb") as f:
while True:
contents = f.read(CHUNK_SIZE)
if contents:
chunks.append(contents)
else:
break
字节块,但是在某些时候也需要两倍的所需内存,而且我可能买不起。
是否有一种方法可以在一个缓冲区中读取一个大的二进制文件,只需要一个大的内存分配,并且有效地以CPU为单位?
答案 0 :(得分:2)
您可以使用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
功能如何运作的了解,我相信应该这样做。