当前位置: 首页 > 面试题库 >

Python复制较大的文件太慢

童子明
2023-03-14
问题内容

我正在尝试使用将大文件(> 1 GB)从硬盘复制到USB驱动器shutil.copy。一个描述我正在尝试做的简单脚本是:

import shutil
src_file = "source\to\large\file"
dest = "destination\directory"
shutil.copy(src_file, dest)

在Linux上只需要2-3分钟。但是在Windows下,同一文件上的同一文件副本要花费10-15分钟以上的时间。有人可以解释为什么并给出一些解决方案,最好使用html" target="_blank">html" target="_blank">python代码吗?

更新1

将文件另存为test.pySource文件大小为1 GB。目的地目录位于USB驱动器中。使用ptime计算文件复制时间。结果在这里:

ptime.exe test.py

ptime 1.0 for Win32, Freeware - http://www.
Copyright(C) 2002, Jem Berkes <jberkes@pc-t

===  test.py ===

Execution time: 542.479 s

542.479 s == 9分钟。我认为shutil.copy复制1 GB文件不需要9分钟。

更新2

USB的运行状况良好,因为同一脚本在Linux下可以很好地运行。在Windows本机xcopy下使用相同文件计算的时间,这是结果。

ptime 1.0 for Win32, Freeware - http://www.pc-tools.net/
Copyright(C) 2002, Jem Berkes <jberkes@pc-tools.net>

===  xcopy F:\test.iso L:\usb\test.iso
1 File(s) copied

Execution time: 128.144 s

128.144 s == 2.13分钟。即使复制测试文件后,我也有1.7 GB的可用空间。


问题答案:

只是添加一些有趣的信息:WIndows不喜欢shutil实现内部使用的微小缓冲区。

我已经快速尝试了以下方法:

  • 将原始的 shutil.py 文件复制到示例脚本文件夹,并将其重命名为 myshutil.py
  • 将第一行更改为 import myshutil
  • 编辑了 myshutil.py 文件并从以下更改了 copyfileobj

def copyfileobj(fsrc,fdst,length = 16 * 1024):

def copyfileobj(fsrc,fdst,length = 16 * 1024 * 1024):

使用16 MB的缓冲区而不是16 KB的缓冲区可显着提高性能。

也许Python需要针对Windows内部文件系统特征进行一些 调整

编辑:

在这里找到了更好的解决方案。在文件的开头,添加以下内容:

import shutil

def _copyfileobj_patched(fsrc, fdst, length=16*1024*1024):
    """Patches shutil method to hugely improve copy speed"""
    while 1:
        buf = fsrc.read(length)
        if not buf:
            break
        fdst.write(buf)
shutil.copyfileobj = _copyfileobj_patched

这是当前实现的简单补丁,并且在这里可以完美地工作。

Python 3.8+: Python
3.8进行了一次重大检查,包括将Windows缓冲区从16KB增加到1MB(仍小于此票证中建议的16MB)。看到票,比较



 类似资料:
  • 我遇到了一个python模块的问题,它无法处理导入大数据文件(文件targets.csv的权重接近1 Gb) 加载此行时会追加错误: 回溯: 我想知道有没有一种方法可以逐行打开targets.csv文件?同时也想知道这会减慢这个过程吗? 这个模块已经很慢了... 谢谢!

  • 此代码检查一个5.1GB的大型文本文件,并检查是否有出现少于100次的单词。然后将5.1GB重写到输出文本文件中,并将这些单词替换为unk。主要问题是创建output.txt需要很长时间。我怀疑方法write_text()打开数据集文件和输出文件的方式会导致问题。 这个脚本背后的目标是:我有一个预构建的vocab和一个文本。这篇课文可能有新单词不在我的词汇表中,所以我想把它们添加到我的词汇表中。但

  • 本文向大家介绍C# FileStream复制大文件,包括了C# FileStream复制大文件的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了C# FileStream复制大文件的具体代码,供大家参考,具体内容如下 即每次复制文件的一小段,以节省总内存开销。当然,本机复制也可以采用.NET内部的System.IO.File.Copy方法。 以上就是本文的全部内容,希望对大家的学习有所

  • 我正在使用熊猫。我试图从一个较大的文件中读取一列名称。这个文件总共是35GB,这使得我的内核死了。所以我想在其中一个专栏里读到。然后我希望“块”这个数据,这样内核就不会死。由此,我需要得到每个名字的总和,并找到计数最高的名字。以下是可能有用的: 要从主文件导入的列名:

  • 问题内容: 如何在Python中复制文件? 我找不到任何东西。 问题答案: ┌──────────────────┬────────┬───────────┬───────┬────────────────┐ │ Function │ Copies │ Copies │Can use│ Destination │ │ │metadata│permissions│buffer │may be dir

  • 问题内容: 我想使用Python制作netcdf文件的副本。 关于如何读取或写入netcdf文件,有很多很好的示例,但是也许还有一个很好的方法,可以进行变量的输入,然后输出到另一个文件。 一个好的方法很不错,以便以最低的成本获得尺寸和尺寸变量到输出文件。 问题答案: 我在python netcdf上 找到了此问题的答案:制作了所有变量和属性的一个副本,但一个副本,但我需要对其进行更改以使其与我的p