4

200 万のテキスト ファイルを処理し、そこにトリプルを生成する必要があります。

txt ファイルxyz.txt(200 万回の入力のファイルの 1 つ) があるとします。これは次のように処理されます。

start(xyz.txt)---->module1(xyz.tpd)------>module2(xyz.adv)-------->module3(xyz.tpl)

x64 4GB Windows システムでより高速かつ最適化された方法で処理できるように、ロジックまたはコンセプトを提案してください。

module1 (作業中): パーサーが呼び出される .bat ファイルを使用して txt ファイルを解析します。これは別のシステム スレッドであり、15 秒後に別の txt ファイルの解析を再び開始します。

module2(working):.tpdファイルを入力として受け取り、ファイルを生成し.advます。module3(working):.advファイルを入力として受け取り、.tpl(トリプル) を生成します。

txt ファイルからスレッドを開始するか、他の時点でスレッドを開始する必要がありますか..? CPU がコンテキスト切り替えで動けなくなるのではないかと心配しています。

私はそれを試すことができるように、誰もがより良いロジックを持っていることができます..!?

4

5 に答える 5

4

ThreadPoolExecutorを使用します。これは、アクティブなスレッドの数などのパラメーターを環境やシステムに合わせて調整します。

于 2013-06-04T07:08:41.110 に答える
4

最も重要なことは、プログラムを作成し、プロファイリングして、ボトルネックがどこにあるかを確認する必要があることです。ディスク I/O 操作がボトルネックになる可能性が高く、マルチスレッドを使用しても問題は解決しません。

その場合、2 台 (3 台? 4 台?) の別々のハード ドライブを使用すると、最適なマルチスレッド ソリューションよりも速度が向上する可能性があります。

さらに、一般的な規則として、実際に機能するコードがあり、何を最適化すべきかが本当にわかっている場合にのみ、アプリケーションを最適化する必要があります。プロフィール、プロフィール、プロフィール。

書き込みに問題がない場合は、将来のマルチスレッド最適化を考慮してください。アーキテクチャは、将来の最適化を可能にするのに十分柔軟でなければなりません。

于 2013-06-04T07:11:46.860 に答える
0

開始点として、1 つの IO スレッドと CPU スレッドのプールを作成します。IO スレッドはテキスト ファイルを読み取って に送りofferBlockingQueueCPUtakeは からファイルをスレッド化してBlockingQueue処理します。次に、アプリケーションをプロファイリングして、IO スレッドに対応するために使用する必要がある CPU スレッドの数を確認します (これを動的に決定することもできます。たとえば、1 つの CPU スレッドから開始し、BlockingQueueしきい値を超えています。おそらく 20 ファイルの行に沿ったものです)。IO スレッドに対応するために 1 つの CPU スレッドのみが必要であることがわかる可能性があります。最初のファイル以外のすべてでシーケンシャル読み取りを使用するか、アプリケーションを高速化するためにそれらを別々のディスクに置くことができます。1 つのアイデアは、ファイルをまとめて zip で読み込むことです。ZipInputStreamこれにより、ファイルを読み取るときのディスク シークの回数が減り、読み取る必要があるデータの量も減ります。

于 2013-06-04T13:39:04.737 に答える