-4

非常に高速な方法で数十万のデータを処理する必要がある課金デーモンがあります。ExecutorSerivce並列処理を実装しました。速度は向上しましたが、それほどではありませんでした。1,00,000 件のレコードを処理するには、約 2.5 ~ 3 時間かかります。これらのデータを 30 分以内に処理するように、どうすれば高速化できますか?

私は実行設定のために次のように書いています:

-Xms2048M -Xmx2048M -XX:MaxPermSize=256m

1 つのプロデューサーと 4 つのコンシューマーを持つプロデューサー コンシューマー モデルを実装しようとしました。各リストには 10,000 レコードを含めることができます。

ArrayBlockingQueue<BillableList> list =new ArrayBlockingQueue<BillableList>(10);

ExecutorService threadPool = Executors.newFixedThreadPool(5);
threadPool.execute(new Consumer("pool1", list)); 
threadPool.execute(new Consumer("pool2", list));
threadPool.execute(new Consumer("pool3", list));
threadPool.execute(new Consumer("pool4", list));
Future producerStatus = threadPool.submit(new Producer("Producer", list)); 
producerStatus.get(); 
threadPool.shutdown(); 

また、データベースへのレコードの更新中に、「データベース ロック待機タイムアウトを超えました」という例外が多数発生します。異なる消費者が同じユーザーを同時に探していることが原因ですか? ArrayBlockingQueueのリストから異なるデータを異なる消費者に取得させるにはどうすればよいですか?

4

2 に答える 2

10

これに対する唯一の可能な答えは、「プロファイラーを使用して、遅い理由を見つけてください」です。問題がどこにあるのかわからない場合、問題について何もすることはできません。ランダムな関数を選択して、それをマイクロ最適化するつもりですか? プロファイラー データまたは何も起こりません。

于 2013-05-04T18:16:03.113 に答える