2012-02-13 8 views
0

私は巨大な多次元行列のデータを効率的に検索する方法を模索しています。巨大な多次元行列の効率的な検索

私のアプリケーションには、複数の次元によって特徴付けられるデータが含まれています。会社のすべての販売に関するデータを保持していることを想像してみてください(私のアプリケーションは全く異なりますが、これは問題を示すためのものです)。すべての販売をすることを特徴とする:

  • 製品
  • それが製品を販売し
  • 従業員が販売された日を買っ
  • 顧客に販売されている製品
  • 支払方法

を販売数量は、私がmillioを持っています何千もの製品で何百人もの従業員が何日間に行った売上のnsです。

私は例えばを計算するための高速な方法が必要になります。

  • 特定の日に従業員によって販売されている総数量
  • 顧客
  • が支払った製品の総量を買った合計数量クレジットカードで
  • ...

は、私が最も詳細な方法でデータを保存する必要がある、と私はマップWHEを使用することができます私は、クエリが実行される、私は複数の組み合わせクラス(データメンバーは異なる順序である)か、マップを必要とし、事前に知っていないので、

class Combination 
    { 
    Product *product; 
    Customer *customer; 
    Day *day; 
    Employee *employee; 
    Payment *payment; 
    }; 

std::map<Combination,quantity> data; 

しかし:再キーは次のように、すべての次元の和であります異なる比較関数(異なるシーケンスを使用してソート)を使用します。

おそらく、問題は、各製品、顧客、...ポインタの代わりに番号を付けることで簡素化できますが、それでも多くのメモリが必要になります。

このような効率的な検索の処理に役立つデータ構造はありますか?

EDIT:

ただ、いくつかのことを明確にする:ディスク上で私のデータはデータベースに保存されているので、私はこれを変更する方法を探していませんよ。

問題は、私の複雑な数学的計算を実行するために、私はこのデータをすべてメモリに持っており、メモリ内のこのデータを効率的に検索する必要があるということです。

インメモリデータベースのヘルプはありますか?たぶん、メモリ内のデータベースがメモリ消費量とパフォーマンスに重大な影響を与える可能性があるので、私はより良い選択肢を探しています。

EDITは(2):

いくつかのより多くの明確化:私のアプリケーションは、データ上でシミュレーションを実行し、エンドユーザが自分のデータベースにこのデータを保存したりしないように自由です。したがって、データそのものは全体の時間を変化させます。これらのシミュレーションとデータの変更を実行している間、前に説明したようにデータを照会する必要があります。

ここでも、単にデータベースを照会するだけでは、オプションではありません。私は本当に(複雑な)メモリ内のデータ構造が必要です。

+1

単一のデータ構造の代わりにデータベースが必要なようです。あなたは自分で自分自身を実装しようとすることができますが、私はそれを再考することは良い考えではないと思います。 –

+0

MySQL(DBの例)は、この最も正確な作業を可能な限り迅速に行うように設計されています。私は@izomorphiusに同意します:製品、顧客、従業員、販売取引(日と支払いを保持する)のようないくつかのテーブルを設定し、DBにそれをさせます。さて、バディ、それはDBの水にあなたのつま先を浸す時間です:-) –

+0

データはすでにデータベースにあり、それはデータベースで既にうまく構成されているので、それは問題ではありません。問題は、私はこのようなデータをメモリに持っており、複雑な数学的計算をその上で実行する必要があるということです。メモリ内のデータベースを使用するとそれを解決できますが、パフォーマンスの影響を恐れています。インメモリデータベースにすべてをスローするのは現実的ですか? – Patrick

答えて

1

EDIT:以前の回答を置き換える。

巨大な構造体の配列に対してqsort()を実行する以外に、他に選択肢があると思いますか?私が見ることのできる方法は他にありません。たぶん、時刻ゼロで一度だけソートして、エントリの動的な挿入/削除を行う際にソートしておくことができます。

+0

提案していただきありがとうございます。しかし、私の例では明らかに十分ではありませんでした。私が管理しているデータは静的ではありません。数学的手法を用いて、ある種のシミュレーションがデータに対して実行され、これらは必ずしもデータベースに終わるとは限らない。だからデータベース上でクエリを実行することは私にとっては別の方法ではありません。 – Patrick

+0

'qsort()'を使うよりも、これを解決する方法はほかにもあります。 – svick

+0

@svick - アレイを並べ替える以外にも、他の方法を提案できますか? –

0

あなたのデータを扱うためにデータベース(メモリ内または非メモリ)を使用することは、これを行う正しい方法のようです。

これをしたくない場合は、たくさんのコンビネーションクラスを実装する必要はなく、オブジェクトを保持できるコレクションを使用するだけです。

関連する問題