sun*_*ima 20 python performance copy
我试图将一个大文件(> 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分钟.有人可以解释原因并提供一些解决方案,最好使用python代码吗?
更新1
保存文件为test.pySource文件大小为1 GB.Destinantion目录位于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 min.我不认为shutil.copy复制1 GB文件需要9分钟.
更新2
USB的健康状况良好,因为相同的脚本在Linux下运行良好.在Windows native xcopy.Here下使用相同文件计算的时间就是结果.
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 min.复制测试文件后,我有1.7 GB的可用空间.
mgr*_*er4 20
只是添加一些有趣的信息:WIndows不喜欢shutil实现的内部使用的微小缓冲区.
我快速尝试了以下内容:
import myshutildef 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无关.事实上,与Linux系统相比,Windows复制过程非常糟糕.
你可以通过使用xcopy或robocopy根据这篇文章来改进这个:是(Ubuntu)Linux文件复制算法比Windows 7好吗?.但在这种情况下,你必须对Linux和Windows进行不同的调用......
import os
import shutil
import sys
source = "source\to\large\file"
target = "destination\directory"
if sys.platform == 'win32':
    os.system('xcopy "%s" "%s"' % (source, target))
else:
    shutil.copy(source, target)
也可以看看: