读取没有内存重新分配的大文件

时间:2017-06-28 12:27:55

标签: python memory

当我想在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为单位?

1 个答案:

答案 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中一样!

以下是一些有用的参考资料:

  1. Official docs
  2. Library Reference
  3. 免责声明:根据我对C&#open功能如何运作的了解,我相信应该这样做。