1

私はマルチスレッドアプリケーションを書いていますが、今のところこの考えがあります。実行時に決定される数値はどこFILE*[n]にありますか。nすべての n 個のファイルを読み取り用に開くと、複数のスレッドがアクセスして読み取ることができます。各ファイルのデータの計算は同等です。つまり、シリアル実行が想定されている場合、各ファイルは同じ時間メモリに残ります。

各ファイルは任意に大きくなる可能性があるため、メモリにロードできると想定しないでください。

このようなシナリオでは、発生するディスク IO の数を減らしたいと考えています。誰かがそのようなシナリオの共有メモリモデルを提案できれば素晴らしいと思います(物事がどのように実装されているかがほとんどわからないため、共有メモリモデルを使用しているかどうかはわかりません)。どうすればこれを達成できるかわかりません。言い換えれば、そのようなシナリオを実装するための最も効率的なモデルは何かを知りたいだけです。を使用してCいます。

編集: より詳細なシナリオ。

実際の問題は、n 個のファイルに含まれるデータに対して n 個のブルーム フィルターがあり、ファイルのすべての要素が対応するブルーム フィルターに挿入されたら、メンバーシップ テストを行う必要があることです。メンバーシップ テストはデータ ファイルの読み取り専用プロセスであるため、複数のスレッドからファイルを読み取ることができ、この問題は簡単に並列化できます。現在、データを含むファイルの数はかなり多い (約 20k であり、ファイルの数はブルーム フィルターの数に等しいことに注意してください) ため、ブルーム フィルターに対してテストするためのスレッドを生成することを選択します。つまり、各ブルーム フィルターには独自のスレッドがあり、他のすべてのファイルを 1 つずつ読み取り、ブルーム フィルターに対してデータのメンバーシップをテストします。そのような場合にディスク IO を最小限に抑えたいと考えています。

4

2 に答える 2

3

開始時に、FILE *を開いたり読み取ったりする代わりに、mmap()関数を使用してファイルをメモリにマップします。その後、ファイルを読み取るスレッドを生成します。このようにして、OSはアクセスをメモリにバッファリングし、キャッシュがいっぱいになったときにのみディスクIOを実行します。

于 2012-06-25T23:39:37.903 に答える
0

プログラムがマルチスレッドの場合、スレッドローカルストレージを作成する手順を実行しない限り、すべてのスレッドがメモリを共有しています。o/s共有メモリを直接必要としません。I / Oを最小限に抑える方法は、可能な限り各ファイルが1回だけ読み取られるようにすることです。同様に、結果ファイルはそれぞれ1回だけ書き込まれます。

それをどのように行うかは、実行している処理によって異なります。

f各スレッドはファイル全体の処理を担当し、スレッドは単にファイルを読み取ります。それ以上I/Oを減らすことはできません。ファイルを複数のスレッドで読み取る必要がある場合は、関連するすべてのスレッドで使用できるように、ファイルのメモリマップを試みる必要があります。32ビットプログラムを使用していて、ファイルが大きすぎてすべてのメモリに収まらない場合は、必ずしもメモリマッピングを実行できるとは限りません。次に、さまざまなスレッドが各ファイルをどのように処理するかを理解し、さまざまなスレッドがファイルを再読み取りする必要がある回数を最小限に抑えるようにする必要があります。64ビットプログラムを使用している場合は、メモリマップドI/Oを介してすべてのファイルを処理するのに十分な仮想メモリがある可能性があります。それでも、データにアクセスする回数を最小限に抑える必要があります。同様の概念が出力ファイルにも当てはまります。

于 2012-06-25T23:44:11.257 に答える