2014-02-15 49 views
11

我想從硬盤複製一個大文件(> 1 GB)到USB驅動器使用shutil.copy。描述我正在嘗試做什麼的一個簡單的腳本是: -Python的副本較大的文件太慢

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

它只需要2-3分鐘在Linux上。但同一個文件拷貝在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 <[email protected] 

=== 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 <[email protected]> 

=== 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的可用空間。

+0

有很多信息,恐怕你的問題的答案是「不」! – hivert

+0

問題非常簡單,腳本也非常簡單,只需將文件從源文件複製到目標文件即可。增加了幾行看起來像一個Python腳本。我不明白爲什麼投下了票:-( –

回答

3

你的問題與Python無關。事實上,與Linux系統相比,Windows複製過程實際上很差。

根據這篇文章,您可以通過使用xcopyrobocopy來改善這一點:Is (Ubuntu) Linux file copying algorithm better than 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) 

參見:

+0

我必須通過調用系統命令subprocess.call來解決([「xcopy」,source,target],shell = True)。但'shutil.copy() '當然。 –

6

只是添加一些有趣的信息:WIndows不喜歡在內部使用的微小緩衝區實施的先決條件。

我已經快試過如下:

  • 複製的原shutil.py文件的示例腳本文件夾並將其重命名爲myshutil.py
  • 改變一號線import myshutil
  • 編輯myshutil。PY文件,並從

改變copyfileobj DEF copyfileobj(FSRC,fdst,長度= 16 * 1024):

DEF copyfileobj(FSRC, fdst,長度= 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 

這是一個簡單的補丁當前實現和完美這裏工作。

+1

在網上找到了這個:http://blogs.blumetech.com/blumetechs-tech-blog/2011/05/faster-python-file-copy.html – mgruber4