【发布时间】:2017-06-28 23:04:46
【问题描述】:
当我想在 python 中读取内存中的二进制文件时,我只是这样做:
with open("file.bin","rb") as f:
contents = f.read()
使用“合理”大小的文件,它是完美的,但是当文件很大时(例如,1Gb 或更大),在监控进程时,我们注意到内存先增加然后缩小,然后再增加,......可能是效果realloc 在幕后,当原始内存块太小而无法容纳文件时。
多次完成,这个realloc + memmove 操作占用大量CPU时间。在 C 语言中,我不会遇到问题,因为我会将正确分配的缓冲区传递给 fread (但在这里我不能,因为 bytes 对象是不可变的,所以我不能预先分配)。
当然,我可以像这样逐块阅读它:
with open("file.bin","rb") as f:
while True:
contents = f.read(CHUNK_SIZE)
if contents:
chunks.append(contents)
else:
break
但是我必须 join 字节块,但这也会在某些时候占用两倍所需的内存,而且我可能负担不起。
有没有一种方法可以读取缓冲区中的大二进制文件,只分配一个大内存,并且在 CPU 方面高效?
【问题讨论】:
-
你读过亚历克斯的这个答案吗? stackoverflow.com/a/1288382/2867928 使用
mmap可能是一个不错的选择。