1

多数のファイルを圧縮するには、(クライアントからの)次の要件があります。

作成されるzipファイルが2**31-1〜2GB未満の場合は、圧縮を使用して作成し(zipfile.ZIP_DEFLATEDを使用)、それ以外の場合は圧縮しないでください(zipfile.ZIP_STOREDを使用)。

現在の解決策は、zip64を使用せずにファイルを圧縮し、zipfile.LargeZipFile例外をキャッチして、非圧縮バージョンを作成することです。

私の質問は、実際にすべてのファイルを処理せずにzipファイルがzip64サイズを超えるかどうかを(おおよそ)計算する価値があるかどうか、そしてそれをどのように実行するのが最善かということです。このような大量のデータを圧縮するプロセスは遅く、重複する圧縮処理を最小限に抑えると、少しスピードアップする可能性があります。

編集:最大および最小のファイルサイズと圧縮率の組み合わせから有用なヒューリスティックを生成できると思うので、両方のソリューションに賛成します。残念ながら、現時点では、StackOverflowにより、(noobよりも高い評判が得られるまで)何も賛成できません。良い提案をありがとう。

4

3 に答える 3

0

zipファイルのサイズを見積もる唯一の方法は、以前に圧縮された同様の性質のファイルの圧縮率を調べることです。

于 2012-01-28T01:11:39.083 に答える
0

私は 2 つの方法しか考えられません。1 つは単純だが手動での調整が必要であり、もう 1 つは複雑さを正当化するのに十分な利点を提供しない可能性があります。

  1. zip の試行をスキップするだけのファイル サイズを定義し、手動で満足のいくサイズに調整します。

  2. これまでに観察された最小の zip 失敗と、これまでに観察された最大の成功した zip の間の最後の N 個のファイルサイズの記録を保持します。誤った選択により、zip する必要のあるファイルが圧縮されないという許容可能な確率を決定します (5% など)。誤って解凍されたままになるファイルの割合がその割合になるように、「わざわざ圧縮しようとしないでください」のしきい値を設定します。

圧縮されているはずのファイルを圧縮する機会を絶対に逃すことができない場合は、すでに解決策があります。

于 2012-01-28T01:36:52.730 に答える
0

ヒューリスティックなアプローチには、常にいくつかの偽陽性といくつかの偽陰性が含まれます。

圧縮されたファイルの最終的なサイズは、圧縮プロセス自体を実行しないとわからないいくつかの要因によって異なります。

Zip64 では、bzip2、LZMA など、さまざまな圧縮形式を使用できます。圧縮形式でも、圧縮するデータに応じて圧縮方法が異なる場合があります。たとえば、bzip2 は Burrows-Wheeler、ランレングス エンコーディング、Huffman などを使用できます。ファイルの最終的なサイズは、圧縮されるデータの統計的特性によって異なります。

たとえば、ハフマンを取ります。シンボル テーブルのサイズは、ファイルのコンテンツがどの程度ランダムに分散されているかによって異なります。

続けて、さまざまなタイプのデータ、シリアル化されたバイナリ、テキスト、画像などのプロファイリングを試みると、それぞれが最終的な圧縮サイズの正規分布が異なります。

非常に大規模なデータベースを構築し、ルールベースのエキスパート システムまたはベイズの定理に基づくエキスパート システムを使用する以外に、プロセスを 1 回だけ実行して時間を節約する必要がある場合、この問題に対する真の 100% のアプローチはありません。

ファイルのブロックをランダムな間隔でサンプリングし、このサンプルを圧縮してから、ファイルのサイズに基づいて線形補間することもできます。

于 2012-01-28T04:20:18.067 に答える