mysql テーブルを mongodb に移行しようとしています。私のテーブルには 600 万のエントリがあります。モーフィアでJavaを使用しています。約 120 万を保存すると、メモリがほぼすべて消費されます。
私はmongoがデータをメモリに保存し、ディスクに保存した後に読んだことがあります。コミットのようなものを送信して、ある程度のメモリを解放することは可能ですか?
mysql テーブルを mongodb に移行しようとしています。私のテーブルには 600 万のエントリがあります。モーフィアでJavaを使用しています。約 120 万を保存すると、メモリがほぼすべて消費されます。
私はmongoがデータをメモリに保存し、ディスクに保存した後に読んだことがあります。コミットのようなものを送信して、ある程度のメモリを解放することは可能ですか?
1) 耐久性に関しては、MongoDB Java ドライバー (Morphia が使用している) にどの戦略を使用するかを伝えることができます。https://github.com/mongodb/mongo-java-driver/blob/master/src/mainを参照してください。 /com/mongodb/WriteConcern.java#L53 . NONE
これは、速度(接続の問題でさえエラーが発生しない) とFSYNC_SAFE
(データが確実にディスクに書き込まれる)の間の単純なトレードオフです。内部の詳細については、 http://www.kchodorow.com/blog/2012/10/04/how-mongodbs-journaling-works/ をご覧ください。
2) データ全体がメモリにマップされます (そのため、32 ビット版のサイズ制限は 2GB です) が、実際にロードされるのは必要な場合のみです。MongoDB は、mmap を使用してそれをオペレーティング システムに任せます。そのため、使用可能な RAM が多い限り、MongoDB は必要なすべてのデータを RAM にロードして、クエリを非常に高速に実行します。使用可能なメモリがなくなった場合、古いものをスワップアウトするのはオペレーティング システム次第です。これには、MongoDB プロセスを再起動してもデータがメモリに保持されるという優れた効果があります。サーバー自体を再起動した場合にのみ、データをディスクから再度取得する必要があります。マイナス面は、オペレーティング システムと比較して、データベース プロセスの方が、最初に何をスワップアウトする必要があるかを少しよく理解している可能性があることです。私は Windows で MongoDB を使用していません。そのメッセージは Mac や Linux では (まだ) 見られませんが、オペレーティング システムがそれを処理するはずです (必要に応じて、情報の一部を自動的に交換します)。ドライバをJOURNAL_SAFE
(データのセキュリティと速度の間の適切な妥協点である必要があります)? この設定では、MongoDB プロセスが停止しても、データが失われることはありません。
3) 一般に、MongoDB は可能な限り多くの利用可能なメモリを使用するように構築されていますが、 http://captaincodeman.com/2011/02/27/limit-mongodb-memory-use-windows/で制限できる場合があります。(仮想)Linuxサーバーを使用しているため、テストしていません。
mongodb が使用するメモリを解放したいだけの場合は、データが処理されて mongod がアイドル状態になった後、このコマンドを実行できます。
use admin
db.runCommand({closeAllDatabases: 1})
次に、によって出力されたマップされた、vsize、解像度が大幅に低下することがわかりますmongostat
。
私は試してみましたが、うまくいきます。お役に立てれば幸いです ^_^