編集:特に圧縮と抽出の速度。
助言がありますか?
ありがとう
そこで、ランダムっぽい大きな zip ファイルを作成しました。
$ ls -l *zip
-rw-r--r-- 1 aleax 5000 115749854 Nov 18 19:16 large.zip
$ unzip -l large.zip | wc
23396 93633 2254735
つまり、23.4K のファイルを含む 116 MB と、時間指定されたもの:
$ time unzip -d /tmp large.zip >/dev/null
real 0m14.702s
user 0m2.586s
sys 0m5.408s
これは、システム提供のコマンドライン unzip バイナリです。純粋な C 実行可能ファイルと同じくらい微調整および最適化されていることは間違いありません。次に (/tmp;-) をクリーンアップした後...:
$ time py26 -c'from zipfile import ZipFile; z=ZipFile("large.zip"); z.extractall("/tmp")'
real 0m13.274s
user 0m5.059s
sys 0m5.166s
...そして、これは標準ライブラリを備えた Python です。CPU 時間はもう少し要求されますが、実際の時間、つまり経過時間は 10% 以上高速です。
もちろん、このような測定を繰り返すことは大歓迎です (特定のプラットフォームで -- 遅い ARM チップなどの CPU が不足している場合、Python の余分な CPU 時間の要求により処理が遅くなる可能性があります -- および対象の特定の zip ファイル、それぞれの大きな zip ファイルは非常に異なる組み合わせであり、パフォーマンスが非常に高い可能性があるためです)。しかし、これが私に示唆しているのは、古き良きものよりもはるかに高速に Python 拡張機能を構築する余地はそれほど多くないということです。これzipfile
を使用する Python は、純粋な C のシステムに組み込まれた unzip よりも優れているからです!-)
大きなファイルをメモリにロードせずに処理するには、Python 2.6 バージョンの の新しいストリームベースのメソッドzipfile
( など) を使用しZipFile.open
ます。ZIP 内のファイル名を強力にサニタイズしていない限り、orを使用しないでください。extract
extractall
(以前は、read
すべてのバイトをメモリに格納するか、zipstreamのようにハッキングする必要がありました。これは現在では廃止されています。)