0

私は、(タイプで) 作成、変更、および破棄できるさまざまな要素に関する使用イベントを (キューを使用して) 受け取る会計システムで作業しています。毎月最大 1000000 件のイベントを開催できます。

月末に、システムは情報を集計して、特定の要素が使用された回数を含むレポートを生成する必要があります。毎日の集計も実行する必要があると確信しています。

例でより明確です。これらは私が受け取るイベントの種類です:

{event: "create", date: "2013/01/01", element_id: 1, element_type: "L"}
{event: "modify", date: "2013/02/05", element_id: 1, element_type: "XL"}
{event: "modify", date: "2013/02/07", element_id: 1, element_type: "L"}
{event: "destroy", date: "2013/02/08", element_id: 1}

そして、これは「2月」の結果になるはずです:

-- from 2013/02/01 to 2013/02/05 + 2013/02/07 to 2013/02/08
{element: "1", element_type: "L", units: "6 days" }
-- from 2013/02/05 to 2013/02/07
{element: "1", element_type: "XL", units: "2 days" }

私の主な関心事は、以前の間隔(たとえば 2 年前)に作成され、まだ効率的な方法で破棄されていない要素を追跡する方法です。

この問題に適合するアルゴリズムを知っていますか? map-reduce プロセスについて考えていましたが、どのように適合するかわかりません (月ごとにフィルターする、前の月に作成された要素を追跡するなど)。どんなアイデアでも大歓迎です。

私は現在 nodejs と mongodb を使用してイベントを保存していますが、それが役立つ場合は java や mysql を使用できます。

ありがとうございました。

4

1 に答える 1

0

この問題を解決するには非常に多くの方法があるため、適切な答えを出すのは困難です。私がすることは、あなたにいくつかの提案をすることです。

  1. すでに述べたように、mapreduce を構築するか、データが許せば新しい集計フレームワークを使用することをお勧めします。これはかなりの量のデータであるため、より頻繁に集計する必要があるかもしれません。
  2. 毎日など、より頻繁に集計し、このデータを新しいコレクションまたは別のデータストアに保存し、毎日スケジュールされた集計タスクを追加します。このようにして、月末に月次データの単純なクエリを 1 つ作成するだけで済みます。
  3. ハドゥープ!

#2 が適切な方法のように思われる場合は、スター スキーマを使用して毎日の集計を格納し、おそらく RDBMS に格納することを検討することをお勧めします。ツールを構築するのに便利なだけでなく、分析のためにスター/スノーフレーク スキーマ データにうまく接続できる製品が市場に数多く出回っています。

楽しいプロジェクトですね!

于 2013-04-02T22:29:54.223 に答える