2017-11-29 10 views
1

RavenDBの問題を解決するのに苦労しています。 私の仕事では、指定されたコレクションのデータベース内の潜在的重複を特定しようとするプロセスがあります(これをユーザーコレクションと呼ぶ)。クエリでのRavendbメモリリーク

つまり、私はコレクションを繰り返しており、各ドキュメントには類似のエンティティを探すためのクエリがあります。想像してみてください。それは実行するのにはかなり時間がかかります。

私の問題は、タスクの実行が開始されると、RavenDBのメモリ消費量はますます高くなります。文字通り成長し、成長しており、システムの最大メモリに達するまで続きます。

しかし、私はクエリを実行しているだけなので、実際には意味がありません。クエリを実行するときに単一のインデックスを使用してデフォルトのページサイズを使用しています(128)。

誰もこのような問題を抱えていますか?私は本当にravendbで何が起こっているのか分かりません。しかし、それはメモリリークのようです。

RavenDBバージョン:3.0.179

+0

どのバージョンを必要とするものを行いますavenDBあなたは使用していますか? – Danielle

+0

は、RavenDBのバージョンで投稿を更新しました – Iamisti

+0

プロセス全体で1つのセッションを使用していますか? –

答えて

0

まず、勧告:あなたは重複をしたくない場合は、よく知られているIDで保管してください。たとえば、重複するUserオブジェクトを必要としないとします。あなたは、彼らがユニークなIDでそれらを保存したい:

var user = new User() { Email = "[email protected]" }; 
var id = "Users/" + user.Email; // A well-known ID 
dbSession.Store(user, id); 

次に、あなたが重複をチェックしたいときに、ちょうど良く知られている名前に対してチェック:あなたはこのパターンに従っている場合

public string RegisterNewUser(string email) 
{ 
    // Unlike .Query, the .Load call is ACID and never stale. 
    var existingUser = dbSession.Load<User>("Users/" + email); 
    if (existingUser != null) 
    { 
     return "Sorry, that email is already taken."; 
    } 
} 

複雑なクエリの実行や古くなったインデックスの心配について心配する必要はありません。

このシナリオで何らかの理由で問題が解決しない場合は、メモリの問題を診断するのに役立ちます。しかし、それを診断するには、コードを確認する必要があります。

0

私は、メモリの使用状況に問題がないようにするには、この手順を以下の私は仕事大規模なコレクションで大規模な操作を行う必要があるときは:

  1. 私は私が処理したい文書のすべてのIDを抽出するためにQuery Streamingを使用(私は各IDため新しいセッションを開く
  2. 専用のセッション)で、私は原稿をセットしてから、私はRの
+0

ステップ2はおそらく過剰です。 IDごとに新しいセッションは必要ありません。ストリーミングは問題ありません。多くのオブジェクトを更新する必要がある場合は、BulkInsertを検討してください。 –

+0

@JudahHimangoおそらくそれは可能かもしれませんが、私はこのアプローチを使用してメモリ使用に関する問題を見ていません – Embri

関連する問題