1

現在、渡されたデータを処理する前にメモリが不足しているという理由だけで機能していないスレッドレスモデルで実行しています。コードを最適化するためにできる限りの変更を加えましたが、それでもまだ十分な速さではありません。

明らかに、スレッドモデルに移る必要があります。次のことを行うための最も簡単で簡単な方法は何でしょうか。

  • メインスレッドはいくつかの情報をワーカーに渡します
  • そのワーカーは、メインメソッドからリファクタリングするいくつかの作業を実行します
  • 労働者は姿を消し、必要に応じて新しい労働者がインスタンス化されます

私はJavaスレッドを使ったことがないので、私が探しているものがかなり単純に見えても、それを読んだことからするとかなり複雑に思えます。

4

3 に答える 3

1

優先度が等しい複数の独立した作業単位がある場合、最善の解決策は通常、ある種の作業キューであり、限られた数のスレッド(パフォーマンスを最適化するために選択された数)がwhile(true)ループ内にあり、作業単位をキューからデキューして実行します。 。

通常、最適なスレッド数はプロセッサ数+/- 1ですが、ディスクI / O要求などによってスレッドが停止する傾向がある場合は、より多くのスレッドが最適になる場合があります。

ただし、システム全体の調整が必要になる場合があることに注意してください。たとえば、より多くのディスクアームが必要になる場合があり、確かにより多くのRAMが必要になる場合があります。

于 2012-10-31T00:15:46.890 に答える
0

メモリ消費を複数のスレッドに分散しても、全体的なメモリ消費は変わりません。あなたの質問から読んだことから、私は前進してあなたに伝えたいと思います:Javaエンジンのヒープを増やしてください。これは役に立ちます。コードではなく、Java 起動パラメータを最適化する必要があるようです。私が間違っている場合は、データをバッファリングする必要があります。ディスクへ!同じメモリ モデル内のスレッドではありません。

于 2012-10-31T01:24:41.503 に答える
0

I'd start by having a read through Java Concurrency as refresher ;)

In particular, I would spend some time getting to know the Executors API as it will do most of what you've described without a lot of the overhead of dealing with to many locks ;)

于 2012-10-31T00:07:21.950 に答える