【问题标题】:System hangs when copying a large binary files in python在 python 中复制大型二进制文件时系统挂起
【发布时间】:2012-08-15 07:39:54
【问题描述】:

我创建了一个实用程序软件,用于在 python 中操作文件复制过程。一切都运行良好,但是当我开始复制任何大于 2 Gb 的文件时,整个系统都会挂起。在我看来,这可能是内存泄漏问题。

我试过了:

  • 使用 Shutil 模块复制它
  • 通过复制字节块来使用惰性操作
  • 逐行复制文件数据
  • 使用文件输入模块
  • 调整缓冲区百万次
  • 用 C 编写副本文件部分,然后用 python 扩展它。

...但是这些都没有奏效。

这里是我的File Script 和我的GUI Script 的链接:

我正在使用具有 2 Gb RAM 的 Windows 7。

有人可以帮忙吗?

【问题讨论】:

  • 欢迎来到 StackOverflow。鼓励您编写少量代码来重现您遇到的确切问题。没有这个,社区就不太可能帮助回答您的问题。另请注意,非常不鼓励在场外发布代码链接。您可以通过点击上面的“编辑”链接来编辑您的问题以更正这些问题。
  • @Maulwurfn 你能链接吗? OP 目前的个人资料没有显示任何其他问题。

标签: python file-io python-3.x wxpython


【解决方案1】:

由于您在复制大于内存的文件时只有 2 GB 的内存,因此会导致问题。不要将整个文件加载到内存中。相反,我会这样做:

with open(myLargeFile) as f:
   with open(myOtherLargeFile, "w") as fo:
   for line in f:            
      fo.write(line)

由于这可能需要很长时间,因此您应该将其置于 GUI 之外的单独线程中,否则 GUI 将出现挂起。这里有几个关于 wxPython 主题的链接:

【讨论】:

    【解决方案2】:

    解决这个问题的好方法是:

    • 使用多处理或多线程
    • 将文件拆分成块
    • 使用 python dbm 存储哪个块属于哪个文件名、文件路径和块偏移量(用于 file.seek 函数)
    • 为读写块创建队列

    【讨论】:

    • 大部分都是糟糕的建议。 multiprocessing(或线程)不会使复制速度更快(事实上,它可能会减慢速度),dbm 完全没有必要。只需读写固定大小的块即可。
    • @duskwuff den 我不明白为什么当我复制超过 2 GB 的文件时我的系统会挂起...我在脚本中使用带有缓冲区的固定大小的块...但不幸的是没有任何工作..
    猜你喜欢
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-15
    • 2012-09-28
    • 2011-03-13
    • 1970-01-01
    相关资源
    最近更新 更多