web-dev-qa-db-ja.com

Pythonプロジェクトをパッケージ化するときにZip_safeをTrueに設定する利点は何ですか?

Setuptoolsのドキュメントには、次のことのみが記載されています。

最大のパフォーマンスを得るには、PythonパッケージをZipファイルとしてインストールするのが最適です。ただし、すべてのパッケージがソースコードまたはデータにアクセスできることが期待されるため、すべてのパッケージが圧縮形式で実行できるわけではありませんしたがって、setuptoolsはプロジェクトをzipファイルまたはディレクトリとしてインストールでき、デフォルトの選択はプロジェクトのZip_safeフラグ( reference )によって決定されます。

実際には、得られるパフォーマンス上の利点は何ですか?私のプロジェクトがZipセーフであるかどうかを調査する価値はありますか、それとも利益は一般的に最小限ですか?

49
saffsd

Zipファイルはディスク上のスペースを節約します。つまり、ディスクからより速く読み取れます。ほとんどのものはI/Oバウンドであるため、パッケージを解凍する際のオーバーヘッドは、ディスクから大きなファイルを読み取る際のオーバーヘッドよりも少ない場合があります。さらに、単一の小さなish Zipファイルがディスク上に順番に保存され、小さなファイルのコレクションがさらに広がる可能性があります。回転式メディアでは、これによりシーク数が削減されるため、読み取りパフォーマンスも向上します。そのため、通常はCPU時間を犠牲にしてディスク使用量を最適化します。これにより、importとロード時間が劇的に改善される可能性があります。

24
Livius

すでに述べた利点に加えて、いくつかの利点があります。

single large .Eggファイルの読み取り(および解凍)は、それが存在する記憶媒体/ファイルシステムに応じて、複数の(可能性としては大量の)小さな.pyファイルをロードするよりも大幅に高速になる場合があります。

一部のファイルシステムは大きなブロックサイズ(1 MBなど)を持っています。つまり、小さなファイルの処理にはコストがかかる可能性があります。ファイルが小さい(たとえば、10 KB)場合でも、実際に読み込むときにディスクから1 MBブロックをロードしている可能性があります。通常、ファイルシステムは複数の小さなファイルを大きなブロックに組み合わせて、これを少し緩和します。

ファイルメタデータへのアクセスが遅いファイルシステム(NFSなどの共有ファイルシステムで発生することがあります)では、大量のファイルへのアクセスも非常に高価になる場合があります。

もちろん、束全体を圧縮することも役立ちます。これは、合計で読み取るデータが少なくて済むことを意味するためです。

簡単に言えば、ご使用のファイルシステムが少量の大きなファイルにより適している場合、それは重要なことです。

12
Kenneth Hoste