私は、IMAPまたはPOPを介して定期的に大量の電子メールを収集し、分析(会話へのクラスタリング、重要な文の抽出など)を実行してから、Webを介して最後までビューを提示するプロジェクトに取り組んでいます。ユーザー。
メインビューは、キャプチャした電子メールからの最新(20程度)の会話の各連絡先のFacebookのようなプロファイルページになります。
私たちにとって、プロフィールページと最近の20個のアイテムを頻繁かつ迅速に取得できることが重要です。また、最近の電子メールをこのフィードに頻繁に挿入している可能性があります。このため、ドキュメントストレージとMongoDBの低コストのアトミック書き込みは非常に魅力的です。
ただし、頻繁にアクセスされない大量の古い電子メール会話もあります(最新の20項目には表示されないため、検索した場合にのみ表示されます。比較的まれです)。さらに、このデータのサイズは、時間の経過とともにコンタクトストアよりも急速に拡大します。
私が読んだところによると、MongoDBではデータセット全体をRAMに残す必要があるようです。これを回避する唯一の方法は、仮想メモリを使用することです。これにより、かなりのオーバーヘッドが発生する可能性があります。特に、Mongoが揮発性データ(プロファイル/フィード)と不揮発性データ(古い電子メール)を区別できない場合、これは非常に厄介になる可能性があります(OSへの仮想メモリの割り当てを委譲しているように見えるため、これがMongoでどのように可能になるかわかりません)。
唯一の選択肢は、(a)すべてを保存するのに十分なRAMを購入することです。これは、揮発性データには問題ありませんが、大量の電子メールをキャプチャするにはコスト効率がほとんどありません。または、(b)仮想メモリを使用して読み取りを確認することです。 /は、揮発性データへの書き込みが遅くなります。
これは正しいですか、それとも何かが足りませんか?MongoDBはこの特定の問題に適していますか?もしそうなら、構成はどのようになりますか?