首页 > 编程问答 >python读取大型二进制文件最有效的方法是什么

python读取大型二进制文件最有效的方法是什么

时间:2024-07-30 10:38:17浏览次数:15  
标签:python file binary memory-efficient

我有一个大(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)

此代码执行以下操作:

  1. 打开文件以进行二进制读取: with open(image_filename, "rb") as f: 打开文件以进行二进制读取 ( "rb" ),并且 with 语句确保在完成后正确关闭文件。

  2. 迭代读取块: while True 循环持续读取块,直到文件结束。

  3. 读取一个块: chunk = f.read(4096) 一次读取 4KB 的数据到 chunk 变量中。你可以调整此缓冲区大小以获得最佳性能。

  4. 检查文件末尾: if not chunk: 如果 chunk 为空,则表示已到达文件末尾,循环中断。

  5. 处理块: transparent_subroutine(chunk) 将读取的块传递给你的处理函数。

优点:

  • 减少内存使用量: 一次只将一小块文件加载到内存中,从而降低了内存使用量。
  • 提高效率: 在处理当前块时,可以同时加载下一个块,从而减少整体处理时间。

修改 transparent_subroutine

你需要修改你的 transparent_subroutine 以便能够处理数据的块,而不是整个文件。例如,如果你的子例程期望整个文件作为字节串,你可以像这样修改它:

def transparent_subroutine(chunk):
  """处理接收到的数据块。

  Args:
    chunk: 一个字节串,表示要处理的数据块。
  """
  # 在这里处理块数据
  # ...

此方法将允许你更高效地处理大型二进制文件,而不会导致内存问题。

标签:python,file,binary,memory-efficient
From: 25754837

相关文章

  • Python:为列表中的每个类对象创建一个不同的副本
    如何制作Python类中对象列表的副本,以便每个副本都是所述Python类的不同实例?假设我有一个Python类classmyClass():def__init__(self,neighbor):self.neighbor=neighbor另外假设myList=[a,b,c,d,...]是一个列表myClass对......
  • 需要使用Python代码将一个文件的一部分复制到另一个文件的相同但空的部分
    例如:需要将文件A中第1部分的x、y和z行复制到文件B中括号之间的第1部分。需要帮助,如果给定多个文件,文件A部分1中的行数将是更改,因此总是需要在括号之间复制到括号之间。文件A:Section1{xyz}Section2{abc}文件B:Section1{}S......
  • Open3D点云裁剪-用Python实现高效的点云处理技术
    点云数据是计算机视觉领域中常用的一种数据表示形式,它以三维空间中的离散点集合的方式来描述物体的形状和结构,在点云数据处理过程中,点云裁剪是一项关键任务,它可以帮助我们从原始的点云数据中提取出感兴趣的物体或区域,从而提高数据处理效率和准确性,本文将介绍如何使用Open3D库和......
  • Python,计算HSV图像的直方图,忽略背景
    我正在尝试使用openCV计算HSV图像的直方图,使用以下代码:defistogrammaHSV(image,histSize):hsv_planes=cv2.split(image)histSize=histSizehistRange=(0,256)accumulate=Falseh_hist=np.array(cv2.calcHist(hsv_planes,[0],None,[......
  • 一文解读Dockerfile
    一文解读Dockerfile一文解读Dockerfile前言上一篇我们说到Docker镜像及镜像分层结构,今天这一篇也跟上一篇联系比较密切,接下来我们来说一下如何使用Dockerfile来构建一个镜像。什么是DockerfileDockerfile是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指......
  • 78.SAP ME - SAP ME和SAP NetWeaver log files的位置
    目录1.defaultTracefiles内容文件位置2.dev_serverfiles内容文件位置3.dev_icmfiles内容文件位置4.responses.trcfiles内容文件位置1.defaultTracefilesYoushouldalwayscheckthislogfirstwhenanysystemissueisreported内容包含SAPNetweave......
  • python性能分析器:cProfile
    代码:(1)importcProfileimportrecProfile.run('re.compile("foo|bar")')运行结果:(2)importcProfiledefrunRe():importrecProfile.runctx('re.compile("foo|bar")',None,locals())runRe()运行结果:(3)i......
  • 基于Python网络招聘数据可视化分析系统的设计与实现
    基于Python网络招聘数据可视化分析系统的设计与实现DesignandImplementationofPython-basedNetworkRecruitmentDataVisualizationAnalysisSystem完整下载链接:基于Python网络招聘数据可视化分析系统的设计与实现文章目录基于Python网络招聘数据可视化分析系......
  • 即使使用 docker run -dit 命令,python-Docker 容器也会在运行两秒后退出
    我想从此处使用Dockerfile测试自定义kubernetes调度程序:FROMpython:3.7RUNpipinstallkubernetesCOPYscheduler.py/scheduler.pyCMDpython/scheduler.py一旦创建了映像和容器:dockerbuild-tapp.dockercontainerrun-d-it--namemy-sched......
  • Python多重处理,如何避免创建具有百万个对象的元组
    python多处理新手。我有一项任务,涉及访问网络服务数百万次并将响应保存在文件中(每个请求都有单独的文件)。我已经得到了高级工作代码,但对一些事情没有感到困惑。以下两种语法有什么区别?pool=Pool(processes=4)pool.starmap(task,listOfInputParametersTu......