大量のデータがあります(ファイルに保存されていますが、関係ありません。主な部分は、データがメモリに収まらないことです)。たとえば、 109行のレコードです。
レコードは、時間、いくつかのキーのセット、およびデータで構成されます。キーは一意ではありません。
例えば
keys: data:
A | B | C |
----------------------
1 | 2 | 3 | 10
1 | 1 | 3 | 150
1 | 1 | 2 | 140
1 | 2 | 5 | 130
5 | 3 | 2 | 120
...
すべてのデータを調べ、ユーザー定義のフィルターを使用してそれらをフィルター処理する必要があります(これは問題ではありません)。次に、集計、合計のカウント、およびデータが最も多い行を返します。
たとえば、与えられたデータで、AとCでグループ化されたすべてのデータを合計したいと思います。
期待される結果:
A | C | data
------------
1 | 3 | 160
1 | 2 | 140
1 | 5 | 130
------------ following (data isn't in 3 highest value) doesn't concern me.
5 | 2 | 120
私はナイーブなソリューションを使用してこれを実装しました、私は持っていますDictionary<tuple(A, C), long>
、そしてそこで合計します。しかし、問題は、私がメモリに収まるよりも多くのユニークなA、Cの組み合わせが存在する可能性があるということです。
フィルタリングが表示される可能性があるため、データを推定することも、SQLを使用することもできません(リレーショナルDBは私には適していません)。
この方法でグループ化するために使用できるメモリ効率の高いアルゴリズムはありますか?SQLはどのように多くのデータを処理しますか?SQLでグループ化を行うことはできますが、使用したくない理由がいくつかあります。
または、私は何をグーグルする必要がありますか?この問題に関する有用な記事は見つかりませんでした。
(私はC#を使用しています。質問は、「次のコードを使用する」というよりも理論的なものです。)