6

現在、データ形式の変換に関する仕事に取り組んでいます。10GB のような大きなファイルがあります。私が実装した現在のソリューションは、このファイルを 1 行ずつ読み取り、各行の形式を変換してから、出力ファイルに出力することです。変換プロセスがボトルネックであることがわかりました。だから私はこれを並行してやろうとしています。

各行は完全な単位であり、他の行とは何の関係もありません。明細内の特定の値が需要を満たさないため、一部の明細が破棄される場合があります。

今、私は2つの計画を持っています:

  1. 1 つのスレッドが入力ファイルから 1 行ずつデータを読み取り、その行をキューに入れ、複数のスレッドがキューから行を取得し、フォーマットを変換してから、その行を出力キューに入れ、最後に出力スレッドが出力キューから行を読み取ります。出力ファイルに書き込みます。

  2. 現在、複数のスレッドが入力ファイルの異なる部分からデータを読み取り、行を処理して、出力キューまたはファイル ロックを介してファイルに出力しています。

皆さん、アドバイスをください。ほんとうにありがとう。

前もって感謝します!

4

2 に答える 2

3

私は最初のオプションを選びます...ファイルから小さな断片でデータを読み取ることは、通常、ファイル全体を一度に読み取るよりも遅くなります(ファイルキャッシュ/バッファリング/先読みなどによって異なります)。

また、出力ファイルを作成する方法について考える必要がある場合もあります (必要に応じて、さまざまなプロセスからすべての行を正しい順序で取得します)。

于 2012-12-19T14:28:33.390 に答える
1

解決策 1 は理にかなっています。

これは、Java のExecutor フレームワークにも適切かつ単純にマップされます。メイン スレッドは行を読み取り、各行を Executor または ExecutorService に送信します。

ただし、順序をそのまま維持する必要がある場合は、さらに複雑になります。

于 2012-12-19T14:37:27.863 に答える