1

gz 形式の 1000 個のファイルのコレクションがあります。私はそれらをチャンクで並行して処理したいと思います。たとえば、各ラウンドで 8 とします。すべてのスレッドがファイルを開いてディスクから読み取るようにすると、多くのプロセスがさまざまな場所から読み取ろうとするため、大幅な遅延が発生しました。

複数のファイルの読み取りを処理する効率的な方法があるかどうか疑問に思っていますか? または、最初にすべてのファイルをメモリにバッファリングします (たとえば、8 つのファイルすべてをバッファしてからスレッドに渡します)。もしそうなら、ファイルをバッファリングする最良の方法は何ですか? バッファ配列? またはいくつかの代替構造?

ありがとうございました。

4

2 に答える 2

0

たとえば 8 の固定サイズのプールを使用する場合 (コアが 8 つあるため)、ファイルの解凍は CPU を集中的に使用するため、これはかなり効率的であることがわかります。

ただし、実際のボトルネックはディスクからのデータの読み取りであるため、これは 4 つのスレッドまたは 2 つだけを使用するよりも高速ではありません。この場合、できることはより高速なディスクを入手することだけです。たとえば、ディスクをミラーリングするか、20 倍高速な SSD を使用します。

于 2012-08-07T11:55:58.393 に答える
0

1000 スレッドでプロセスを圧倒していると思われます。スレッドは特に軽量というわけではありません (たとえば、各スレッドはデフォルトで 512k のスタック スペースを取得します)。

より効率的なモデルは、( ThreadPoolExecutorを介して) スレッド プールを使用し、システムで最適な同時スレッド数に合わせて調整することです (たとえば、上記で 8 を提案しました。これは、スレッド数にある程度依存することをお勧めします)。あなたが持っている空きCPU)。

.gzファイルは executor に送信された 1 つのファイルで表されCallable、executor は複数のジョブを同時に実行するように管理します。

于 2012-08-07T11:51:54.383 に答える