sql >> データベース >  >> NoSQL >> MongoDB

クエリを実行するときにマングースによってメモリ使用量を減らす方法

    デフォルトのマングース.find() もちろん、すべての結果を「配列」として返すため、常に大きな結果のメモリが使用されるため、「ストリーム」インターフェイスが残ります。

    ここでの基本的な問題は、ストリーム を使用していることです。 インターフェイス(これは基本ノードストリームから継承するため)各データイベントは「発生」し、関連するイベントハンドラーは継続的に実行されます。

    これは、「ストリーム」がある場合でも、イベントハンドラーでの後続のアクションが「スタック」し、少なくとも大量のメモリを消費し、そこでさらに非同期プロセスが起動されると、コールスタックを消費する可能性があることを意味します。

    したがって、実行できる最善のことは、ストリーム処理のアクションを「制限」し始めることです。これは、.pause()を呼び出すのと同じくらい簡単です。 方法:

    var stream = model.find().stream();   // however you call
    
    stream.on("data",function() {
        // call pause on entry
        stream.pause();
    
        // do processing
        stream.resume();            // then resume when done
    });
    

    したがって、.pause() ストリーム内のイベントの発行を停止します。これにより、イベントハンドラーのアクションを続行する前に完了できるため、すべてが同時に発生することはありません。

    処理コードが完成したら、 .resume()を呼び出します。 、ブロック内で実行された非同期アクションのコールバックブロック内のここに示されているように、ブロック内で直接。同じルールが非同期アクションにも適用され、resumeを呼び出す前に「all」が完了を通知する必要があることに注意してください。

    同様に適用できる他の最適化があり、「キュー処理」または「非同期フロー制御」の利用可能なモジュールを調べて、これを並列実行してパフォーマンスを向上させるのに役立てることができます。

    しかし、基本的には.pause()を考えてください 次に、処理して.resume() 処理中に大量のメモリを消費しないようにします。

    また、「出力」に注意し、応答のために何かを構築する場合は、同様に「ストリーム」を再度使用してみてください。あなたがしている仕事が実際にメモリ内に別の変数を構築しているだけなら、これはすべて無駄になるので、それを知っておくと役に立ちます。



    1. 値またはデフォルト値によるMongoidクエリ

    2. Spring RedisTemplate:複数のモデルクラスをJSONにシリアル化します。複数のRedisTemplatesを使用する必要がありますか?

    3. Clouderaオペレーショナルデータベースにトランザクションサポートをもたらします

    4. マングースはプロパティが正しく機能していないことを期限切れにします