1

各ファイルのキーに応じてさまざまなファイルに出力する文字列のリストがあります(このキーはリストに存在するため、特定のノードでこのキーが1の場合、文字列をファイル1に書き込む必要があります。 txtで、キーが2の場合、出力は2.txtなどにリダイレクトされます...)。

私が考えていたのは、各リストメンバーに一意のキーを割り当てて一意のレコードにし、システムで使用可能なプロセッサの数に応じて複数のスレッドを生成することです。スレッドは、ノードの出力をノードのプール(つまり私のリスト)から関連するファイルにリダイレクトします。これがバッチ処理に適した設計であるかどうかについては懐疑的でした。または、出力全体を実行するためのスレッドを1つだけ持つ必要があります。

ps-私がバッシングされる前に、私はただの好奇心旺盛な学習者だと言わせてください。

4

3 に答える 3

0

シングルスレッドにします。次に、実行して、ボトルネックが何であるかを見つけます。ボトルネックがディスクIOではなくCPUであることがわかった場合は、並列処理を有効にします。

于 2013-01-10T08:28:41.180 に答える
0

そのためには同時実行モデルが必要です-しかし、それは深刻に聞こえます:)

まず、同時に実行できることと、相互に関係のないことを分析します。プログラムの各ステップが、IP ネットワークなどの間で一種の通信を行う異なるマシンで実行されると想像してください。

次に、これらのインスタンス (アクション/マシン) 間のフローを描画します。リストやファイルなど、実行する必要があるリソース アクションをマークします。リソースを個別のインスタンスとしてマークします (アクションとマシンと同じ)。

ファイルシステムを写真に入れて、個別のファイルの書き込みが高速化されるかどうか、またはファイルシステムで終了して再度シリアル化されるかどうかを確認します。

インスタンスを接続します。そして、利益が得られるかどうかを確認してください。次のようになります。

        list
         |
      list reader
        /  \     \
       /    \     ----------\
    file    file          file
   writer  writer        writer
     |        |              |
  file 1    file 2         file 3
     \        /              |
      \      /               |
     file system 1      file system 2

この例では、いくつかの並列実行を取得することが理にかなっていることがわかります

于 2013-01-10T09:18:28.253 に答える
0

私が理解しているように、あなたの処理手順は次のとおりです。

  • キーでファイルを選択
  • アイテムをファイルに書き込む

これは、並列処理がパフォーマンスの向上につながる場合には当てはまらないと思います。このコードを高速化したい場合は、バッファリングと非同期 I/O を使用してください。

  • 各ファイルのフラグを維持する -書き込み進行中
  • ファイルに何かを書き込みたい場合 - このフラグをチェックしてください
    • 進行中の書き込みが False の場合:
      • 書き込み進行中= Trueに設定
      • アイテムをバッファに追加する
      • このバッファのファイルへの非同期的な書き込みを開始する
    • 書き込み進行中が True の場合:
      • アイテムをバッファに追加する
  • 保留中の非同期操作が完了したとき
    • 空でないバッファがあるかどうかを確認し、ある場合は非同期書き込みを開始します

もっと簡単な方法があります: バッファリングと同期 I/O を使用します。上記の非同期アプローチよりも遅くなりますが、それほど遅くはありません。複数のスレッドを開始し、各スレッドで個別にリストをトラバースできます。各スレッドは、一意のキー セットのみを処理する必要があります。たとえば、2 つのスレッドを使用できます。最初のスレッドは奇数キーの項目のみを書き込み、2 番目のスレッドは偶数キーの項目のみを書き込む必要があります。

于 2013-01-10T08:47:14.533 に答える