8

編集:特に圧縮と抽出の速度。

助言がありますか?

ありがとう

4

2 に答える 2

15

そこで、ランダムっぽい大きな 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 よりも優れているからです!-)

于 2009-11-19T03:32:10.573 に答える
5

大きなファイルをメモリにロードせずに処理するには、Python 2.6 バージョンの の新しいストリームベースのメソッドzipfile( など) を使用しZipFile.openます。ZIP 内のファイル名を強力にサニタイズしていない限り、orを使用しないでください。extractextractall

(以前は、readすべてのバイトをメモリに格納するか、zipstreamのようにハッキングする必要がありました。これは現在では廃止されています。)

于 2009-11-19T13:47:46.357 に答える