0

私のmongodbには膨大な量のデータがあります。ツイート(50 GB)でいっぱいで、私のRAMは8GBです。クエリを実行すると、すべてのツイートが取得され、mongodbがRAMをいっぱいにし始め、8 GBに達すると、ファイルをディスクに移動し始めます。これは本当に遅くなる部分ですwwww。そこで、クエリをスキップしてインデックスの使用を開始するように変更しました。これでインデックスが作成され、プログラムに8 GBのみを照会し、ファイルで使用された最後のツイートのIDを保存すると、プログラムが停止します。次に、プログラムを再起動すると、ファイルからツイートのIDが取得されます。しかし、mogodサーバーはまだ最初の8GBでRAMを占有しています。これは、最後のインデックスがあるため、使用されなくなります。再起動せずにmongodbサーバーのメモリをクリーンアップするにはどうすればよいですか?

(勝利で走る)

4

1 に答える 1

0

ここであなたの論理に少し混乱しています。

そのため、クエリをスキップしてインデックスの使用を開始するように変更しました。今、私はインデックスを持っていて、プログラムに 8GB だけをクエリし、最後に使用されたツイートの ID をファイルに保存すると、プログラムが停止します。

範囲指定されたクエリを使用しても、ページインする必要があるデータの量は改善されません (実際には、インデックスのために悪化する可能性があります)。インデックスを使用して大量のスキップ (42K 以上の行のスキップなど) を行うことで、サーバー側のクエリが高速化されるだけです。あなたがそれと同じであるskip()が、インデックスにいる場合(カバーされたインデックスなし)、まったく同じようにページングしています。

メモリ マッピングとワーキング セットが原因で遅くなります。RAMよりも多くのデータがあり、それだけでなく、RAMよりも多くのデータを使用しているため、おそらく常にページフォールトが発生しています。

プログラムを再起動してもこれは解決されず、クエリのためにデータ OS 側を (再起動または特定のコマンドで) クリアすることもできません。おそらく次のいずれかが必要です。

  • クエリについて考えて、作業セットがメモリに一致するようにします
  • または、プライマリ サーバーを構築する必要がないように、多数のサーバーにまたがってデータをシャーディングします。
  • または、より大きなプライマリ サーバーを取得します (moar RAM!!!!!)

編集

MongoDB が完全に割り当てられたロットを使用しているため、OS の LRU は古いデータをすでにスワップアウトしているはずです。終わり)。

于 2013-01-06T16:34:15.307 に答える