2

ストリーミング API からデータを収集しており、リアルタイム分析ダッシュボードを作成したいと考えています。このダッシュボードには、1 時間あたりのドキュメント数をプロットする単純な時系列が表示されます。私の現在のアプローチが最適かどうか疑問に思っています。

次の例では、ストリーム内の新しいドキュメントごとに on_data が起動されます。

# Mongo collections.
records = db.records
stats = db.records.statistics

on_data(self, data):
    # Create a json document from data.
    document = simplejson.loads(data)

    # Insert the new document into records.
    records.insert(document)

    # Update a counter in records.statistics for the hour this document belongs to. 
    stats.update({ 'hour': document['hour'] }, { '$inc': { document['hour']: 1 } }, upsert=True)

上記の作品。1 時間あたりのドキュメント数を示す美しいグラフが表示されます。私の質問は、このアプローチが最適かどうかについてです。ドキュメントごとに 2 つの Mongo リクエストを作成しています。1 つ目はドキュメントを挿入し、2 つ目はカウンターを更新します。ストリームは、1 秒あたり約 10 個の新しいドキュメントを送信します。

たとえば、mongo に db.records.statistics を RAM に保持するように指示する方法はありますか? これにより、サーバーのディスクアクセスが大幅に削減されると思います。

4

1 に答える 1

3

MongoDB はメモリ マップを使用してファイル I/O を処理するため、基本的にすべてのデータを既に RAM にあるかのように扱い、OS に詳細を把握させます。要するに、コレクションを強制的にメモリに格納することはできませんが、オペレーティング システムが問題を適切に処理できれば、重要なものは格納されます。mongo のメモリ モデルと、ユース ケースに最適な OS 構成を最適化する方法の詳細については、ドキュメントへのこのリンクを確認してください: http://docs.mongodb.org/manual/faq/storage/

しかし、あなたの問題に具体的に答えるには、あなたは大丈夫です。どのような場合でも、毎秒 10 回または 20 回の書き込みがディスクのボトルネックになることはありません (古いハードウェアで実行していると仮定します)。私がお勧めすることの 1 つは、統計で「時間」を超えるインデックスを作成することです。まだ行っていない場合は、更新でドキュメントをより高速に検索できるようにします。

于 2013-09-17T20:27:28.210 に答える