非常に高速な方法で数十万のデータを処理する必要がある課金デーモンがあります。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
のリストから異なるデータを異なる消費者に取得させるにはどうすればよいですか?