2

morphia 0.99とjavaドライバー2.7.3を使用しています。asListを使用してレコードを1つずつフェッチすることと、asListで結果を取得することの間に違いがあることを学びたいと思いfetchます(レコードを取得するのに十分なメモリがあると仮定しますasList)。

大規模なコレクションを繰り返し処理しますが、フェッチ操作中にサーバーでfetch発生cursor not found exceptionすることがあるため、続行するには別のコマンドを実行する必要があります。これにはどのような理由がありますか?

1-)fetch the record 
2-)do some calculation on it 
3-)+save it back to database again 
4-)fetch another record and repeat the steps until there isn't any more records. 

では、どちらが速いでしょうか?レコードを1つずつフェッチするか、asListを使用して結果の大部分を取得しますか、それともmorphia実装を使用してレコード間に違いはありませんか?

答えてくれてありがとう

4

3 に答える 3

3

私が実装を理解している限りfetch()、DBから結果をストリーミングし、asList()すべてのクエリ結果をメモリにロードします。したがって、両方ともクエリに一致するすべてのオブジェクトを取得しますが、asList()すべてをメモリにロードし、ユーザーにfetch()任せます。

ユースケースの場合、CPUの観点からはどちらも高速ではありませんが、fetch()使用するメモリが少なく、DBレコードが多い場合に爆発しないようにする必要があります。

于 2014-08-08T10:13:58.503 に答える
2

ソースコードから判断すると、結果をasList()使用fetch()して集計しているので、2つの違いはあまりわかりません。

于 2012-12-28T01:47:00.050 に答える
1

非常に便利な違いの1つは、次の2つの条件がシナリオに適用される場合です。

  1. クエリで使用offsetしていました。limit
  2. オブジェクトの値を変更して、クエリで返されないようにしました。

つまり、でクエリを実行していてawesome=true、とを使用offsetlimitて複数のクエリを実行し、一度に100レコードを返し、メモリを使いすぎないようにしたとします。反復ループでawesome=falseオブジェクトを設定して保存すると、一部のレコードの更新を見逃してしまいます。

このような場合はfetch()、より良いアプローチになります。

于 2014-09-14T02:44:48.740 に答える