2

私のアプリケーションでは、大量のデータを読み取る必要があります。すべてのデータを取得したら、それをリストに入れて処理し、それに応じて作業します。

データベースプロセスからのデータ取得を高速化するために何かできることはありますか? 私のデータベースは別のサーバーにあり、データベースと対話するために Java を使用しています。

データの明確なサイズ、つまり、処理する必要がある特定の行数がありません。また、マルチスレッド化できると聞きましたが、どうすればよいのでしょうか? データは不定であるため、データを分割する方法がわからないためです。つまり、次の疑似コードが適用される場合

for(i=0 to number of partition) // Not certain on the number of partitions
    create new thread and get data.

または、何らかの属性に基づいてデータをハッシュし、後で各スレッドにマップの特定のインデックスをフェッチするように指示することもできますが、データをフェッチする前にそれをマップするにはどうすればよいでしょうか?

考えられるすべての解決策を調べることができますか?どうすればそれを実行できますか? さらに情報が必要な場合はお知らせください。

ありがとう。

4

1 に答える 1

4

マルチスレッド化できると聞きましたが、どうすればいいのでしょうか?

これは、リモート サーバーからの情報のクエリを高速化するための良い選択です。
通常、これらのタスクでは、サーバーとの IO が主なボトルネックであり、マルチスレッド化により、同時に複数の行を「要求」することができ、IO 待機時間を効果的に削減します。

しかし、それではどうすればいいですか?

アイデアは、作業をより小さなタスクに分割することです。詳細については、Java高レベル同時実行 APIを参照してください。
1 つの解決策は、各スレッドがサーバーからサイズのチャンクを読み取れるようにし、Mスレッド (サーバー) にまだデータがある間、各スレッドに対してプロセスを繰り返すことです。そのようなもの(スレッドごと):

data = "start";
int chunk = threadNumber;
while (data != null) {
  requestChunk(chunk);
  chunk += numberOfThreads;
}

ここでは、「範囲外」になると、サーバーが返されるnull(またはrequestChunk()処理して null を返す) と仮定します。

または、何らかの属性に基づいてデータをハッシュし、後で各スレッドにマップの特定のインデックスをフェッチするように指示することもできます

データを繰り返し処理し、そのすべてを取得する必要がある場合、通常、ハッシュは不適切なソリューションです。これはキャッシュが非常に非効率的であり、この場合にはオーバーヘッドが大きすぎます。

于 2012-08-23T06:18:42.923 に答える