2016-06-26 6 views
0

私は深刻な問題があります。私は1時間で50万レコードを処理するコードに取り組んでいます。通常、これらのレコードはそれぞれ別のテーブルにデータを持っています。HibernateとThreadingを使って何十万というレコードをすばやく処理しています。

私は現在休止状態を使用しています。私は100レコードを処理するために複数のスレッドを持つExecutorサービスを使用しようとしました.10個のスレッドがそれぞれ100レコードを処理し、スレッドが完了するとプールを残し、別のスレッドが入ります。

しかし、事は速度が改善されていません。私が気づいたのは、スレッドを実行するほどプロセス全体が遅くなるということです。現在、これらのレコードのうち100件をスレッドが処理するには2分かかります。私は10スレッドを実行している場合、それは1スレッドで1000レコードを実行することと本質的に同じです20分かかる!

これらのスレッドは同時に実行されるはずだと思いました。私が利用できる別の実装はありますか?

私は8コアと64GIG RAMを搭載したサーバーを使用しています。

おかげ

+1

あなたのボトルネックはおそらく他の場所です。ディスク/ネットワークIO、データベースロック(トランザクション管理)、Javaコードのセマフォ(同期ブロックなど)について考えてみてください。詳細な解析から始めたいと思っています... – home

+0

"私はこれらのスレッドが同時に実行されるはずだと思いました。 –

+0

私は1つのスレッドを実行すると、100レコードの処理を完了するのに約2分かかります。 1つの処理100レコードで10スレッドを実行すると、約20分かかります。それは私と同時のようには聞こえません –

答えて

0

私は、最も軽い形で休止状態のエンティティを照会することで問題を解決しました。オブジェクト全体のリストをすべての変数で照会するのではなく、オブジェクト全体のリストをIDだけで照会し、スレッドに送信してから、必要な特定の列に従って各オブジェクトを照会しました。

これは処理を高速化しました。私のテーブルのほとんどには多くの列がありますが、そのほとんどは私の処理では必要ありません。

0

は私があなただったら、私はそのようなJProfilerをなどのプロファイルの下でアプリケーションを実行したいと処理が立ち往生場所を参照してください。 30分で何が問題か分かります。

関連する問題