我有一个大(21 GB)文件,我想将其读入内存,然后传递给一个子例程,该子例程对我透明地处理数据。 我在 Centos 6.5 上使用 python 2.6.6,因此无法升级操作系统或 python。 目前,我正在使用
f = open(image_filename, "rb")
image_file_contents=f.read()
f.close()
transparent_subroutine ( image_file_contents )
,速度很慢(约15分钟)。 在开始读取文件之前,我知道文件有多大,因为我调用 os.stat( image_filename ).st_size
所以我可以预先分配一些内存,如果有意义的话。
谢谢
虽然你可以一次性读取整个文件,但对于 21GB 的文件来说,这在 Python 中可能不是最有效的方法,尤其是使用旧版本时。这种方法会导致高内存消耗,并可能导致程序崩溃或变慢。
更好的方法是 以块的形式读取文件 :
def process_large_file(image_filename):
"""以块的形式读取大型二进制文件并进行处理。
Args:
image_filename: 要读取的二进制文件的路径。
"""
with open(image_filename, "rb") as f:
while True:
chunk = f.read(4096) # 一次读取 4KB
if not chunk:
break
transparent_subroutine(chunk)
process_large_file(image_filename)
此代码执行以下操作:
-
打开文件以进行二进制读取:
with open(image_filename, "rb") as f:
打开文件以进行二进制读取 ("rb"
),并且with
语句确保在完成后正确关闭文件。 -
迭代读取块:
while True
循环持续读取块,直到文件结束。 -
读取一个块:
chunk = f.read(4096)
一次读取 4KB 的数据到chunk
变量中。你可以调整此缓冲区大小以获得最佳性能。 -
检查文件末尾:
if not chunk:
如果chunk
为空,则表示已到达文件末尾,循环中断。 -
处理块:
transparent_subroutine(chunk)
将读取的块传递给你的处理函数。
优点:
- 减少内存使用量: 一次只将一小块文件加载到内存中,从而降低了内存使用量。
- 提高效率: 在处理当前块时,可以同时加载下一个块,从而减少整体处理时间。
修改
transparent_subroutine
:
你需要修改你的
transparent_subroutine
以便能够处理数据的块,而不是整个文件。例如,如果你的子例程期望整个文件作为字节串,你可以像这样修改它:
def transparent_subroutine(chunk):
"""处理接收到的数据块。
Args:
chunk: 一个字节串,表示要处理的数据块。
"""
# 在这里处理块数据
# ...
此方法将允许你更高效地处理大型二进制文件,而不会导致内存问题。
标签:python,file,binary,memory-efficient From: 25754837