ITよろづや

ITから生活の参考になる情報を備忘録代わりに残していきます

Python 大きなファイルをコピー処理(shutil.copy)が遅い

Python 大きなファイルをコピー処理(shutil.copy)が遅いという事象に関する情報になります。

 

情報元はこちら。

performance - Python copy larger file too slow - Stack Overflow

 

shutil.copyを使って、大きなファイル(1GB以上)をハードディスクからUSBドライブにコピーしようとしています。私がやろうとしていることを描いた簡単なスクリプトは以下の通りです。

 

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.pyとして保存ソースファイルのサイズは1GBです。デスティネーションディレクトリは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秒 == 9分。1GBのファイルをコピーするのに、shutil.copyが9分もかかるとは思えませんが。

 

アップデート2

同じスクリプトLinuxでも動作するので、USBの健康状態は良好です。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秒 == 2.13分。テストファイルをコピーしても、1.7GBの空き容量があります。

 

 

続いて、回答内容の抜粋です。

 

あなたの問題はPythonとは何の関係もありません。実際、WindowsのコピープロセスはLinuxシステムに比べて本当に貧弱です。

 

https://superuser.com/questions/302753/is-ubuntu-linux-file-copying-algorithm-better-than-windows-7

 

こちらの投稿によれば、xcopyrobocopyを使うことで改善できます。(Ubuntu) LinuxのファイルコピーアルゴリズムWindows 7よりも優れている?しかし、この場合、LinuxWindowsで別々の呼び出しをしなければなりません...。

 

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)

 

実際にコピーのパフォーマンスがでない場合は、robocopyで改善することがあります。

 

シゴトがはかどる Python自動処理の教科書