python - 读取大文件而不重新分配内存

标签 python memory

当我想在 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 语言一样!

这里有一些有用的引用:

  1. Official docs
  2. Library Reference

免责声明:根据我对 C 的 open 函数如何工作的了解,我相信这应该可以解决问题。

关于python - 读取大文件而不重新分配内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44802421/

相关文章:

python - 如何自动命名 Pandas 数据框列?

python - 将连续的数字组合成范围元组

python - 如何直接访问SQLite数据库删除alembic_version表?

c++ - 在堆 : small pieces or big piece 上分配的最佳方法是什么

c# - 如何知道为引用和值类型分配内存的位置?

c - 指针在内存中的作用域

python - 如何覆盖 pandas DataFrame 中的数组单元格?

python - Numpy:向量化 np.argwhere

java - 强制 JVM 释放内存

c++ - 变量 'sortArray'周围的堆栈已损坏