メイン メモリよりも大きなデータセットがあります。圧縮後、メモリに収まります。ただし、メモリ内の解凍は一種の計算集約型です。ハード ドライブ内の圧縮されていないデータにアクセスする場合と比較して、メモリ内解凍には完了までの時間の点で利点がありますか? HDD からのデータが完全にメモリにロードされると仮定します (つまり、処理中に HDD へのランダム アクセスはありません)。誰もが以前にベンチマークを行ったことがあります。ありがとう。
4 に答える
まず、データは圧縮可能でなければなりません。圧縮がない場合は、明らかに HDD への圧縮と圧縮解除が遅くなります。HDD 上の多くのファイルは、画像ファイル、ビデオ ファイル、オーディオ ファイル、zip や .tar.gz ファイルなどの無損失圧縮アーカイブなど、既に圧縮されているため、圧縮できません。
圧縮可能な場合、zlib解凍は HDD 読み取りよりも高速である可能性が高く、lz4解凍は高速である可能性が非常に高くなります。
これは、「場合による」の後に「状況に応じて測定する必要がある」という形でのみ正しく答えることができる、古典的な種類の質問です。
これは、データ、データの処理方法、およびマシンの仕様によって異なります。正確なシナリオをプロファイリングせずにこれに答えることがほとんど不可能になるいくつかの考慮事項:
- あなたの圧縮はどのくらい良いですか?圧縮アルゴリズムが異なれば、CPU の使用量も異なります。
- データはどのように使用されますか?処理前にバッファする必要があるデータの量は、解凍と処理の間でマルチスレッド化できる量に影響し、回答に大きく影響します。
- あなたの環境は?処理するデータが 1 TB の 16 コア サーバーは、データが 1 GB の派手な電話とは大きく異なりますが、あなたの質問からは、どちらを扱っているかは明確ではありません (HDD は、少なくとも電話ではなくコンピューターを示唆していますが、サーバーvs デスクトップはまだ関連性があります)。
- データがロードされた後、どの程度のランダムアクセスを行っていますか? ロード後に HDD へのランダム アクセスがないことをお勧めしますが、完全に圧縮されたデータをロードし、一度にデータの一部のみを解凍する場合は、データへのアクセスのパターンが重要です。すべてが 2 回 (またはそれ以上!) 処理されます。
最終的に、この質問は非常に主観的なものであり、パフォーマンスの違いが重要になると思われる場合は、いくつかの基本的なテスト シナリオを作成し、詳細にプロファイルすることをお勧めします。
より具体的な例として、負荷の高いオーディオまたはビジュアル処理を行っている場合、プロセスは CPU を集中的に使用しますが、通常はデータ ストリームを受け入れます。そのシナリオでは、ボトルネックが CPU になるため、圧縮によって速度が低下する可能性があります。
あるいは、ファイルから 10 億行のテキストを読み込んで、それぞれの母音の総数を数えている場合、おそらくディスク IO がボトルネックになるでしょう。ファイル。
私たちの場合、バッチ処理モードで構造化されたメッセージ (つまり、つぶやき) を通過するバッチ処理コードを最適化しました。表現を JSON からmsgpackに切り替え、 を使用してファイル全体をマッピングするmmap
と、磁気ディスクの速度が制限要因であり、明らかに I/O バウンドの状態になりました。
大部分が UTF-8 テキストを含む ed メッセージは、 LZ4msgpack
で 3 ~ 4 の圧縮率で圧縮できることがわかりました。LZ4 解凍に切り替えた後も、最適化されたコードは依然として I/O バウンドでしたが、スループットは大幅に向上しました。
あなたの場合、LZ4 の実験を開始します。