3

数行のテキスト ファイルを取得し、このファイルで文字列を探しています。次のコマンド ライン パラメーターをプログラムに渡す必要が あり
ます 。

そのようなプログラムはどのように構築されるべきですか?

4

4 に答える 4

3

いくつかの考え。

  • 各プロセスから個別にファイルを開く必要があります。そうしないと、単一のファイル記述子を共有するため、ファイル内で共有位置が設定されます (システム固有の可能性があるため、コメントを参照してください...)。
  • ディスク アクセスやキャッシュ ミスのパターンが原因で、期待する速度の向上が見られない場合があります。

ファイルをメモリ マッピングすることで、両方の問題を解決できる可能性があります (それでも、キャッシュ ミス率が高くなるリスクがあります)。


これがどれだけ必要ですか?時期尚早の最適化になるという実際のリスクがあります。やむを得ない必要性なしに問題に触れないことをお勧めします。本当。

于 2008-10-11T19:46:14.640 に答える
2

これを並列化する必要があると考える理由と、実際にパフォーマンス上の利点が見られるかどうかを検討してください。ディスク アクセス時間によって制限される可能性が高く、分岐にはオーバーヘッドがあります。最良のオプションは、標準のシングルスレッド検索を実行することです (おそらく正規表現を使用)。

于 2008-10-11T19:51:06.940 に答える
1

これが本当に必要だと思う (またはこれは宿題ですか?) と仮定すると、(比較的高レベルの) 方法は次のようになります。

  1. 検索するファイルのサイズを計算します (たとえば、fopen、fseek(file, END)、fclose を使用)
  2. 各プロセスに、ファイル内の 2 つのオフセット (検索開始オフセットと検索終了オフセット) を関連付けます。
    startIndex = indexOfProcess * fileSize / numberOfProcesses
    endIndex = (indexOfProcess + 1) * fileSize / numberOfProcesses
    
    オーバーラップを追加することで (文字列サイズの関数になります)、検索する文字列が 2 つ以上のプロセスのスライスにまたがる可能性があるという事実を考慮する必要があります。
  3. fork、各プロセスでファイルを (読み取りモードで) 開き、開始インデックスに fseek し、サイズ (endIndex - startIndex) の単一ファイルがあるかのように文字列を検索し、結果を画面にダンプします (または、より具体的な要件がある場合は、それについてお知らせください)。
于 2008-10-11T21:23:01.357 に答える
1

これは宿題か、役に立たないかのどちらかです。ボトルネックは、CPU パワーではなく、ディスク帯域幅にあります。同時アクセスを使用すると、速度が低下するだけです。

于 2008-10-11T21:35:24.127 に答える