2012-03-22 9 views
2

私は計算と操作を、大体7500行と30000列の非常に大きなテーブルまたはマトリックスで実行する必要があります。巨大マトリックス/テーブルを表現する

文書ID |ワード1 |単語2 |単語3 | ... |単語30000 |ドキュメントクラス
0032 1 0 0 1 P

つまり、大部分のセルにブール値(0と1)が含まれます。

派生語や特徴選択(削減技術を使って、単語の数を減らすことを)useingされるだろう行われる必要がある計算だけでなく、計算クラス単位または単語など

何I行列を表現するためのOOPモデルを設計し、その後オブジェクトをディスクに直列化して、後でそれらを再利用できるようにすることが念頭に置かれています。たとえば、私は各行または各列、またはおそらく別のクラス内に含まれている各交差点のオブジェクトのオブジェクトを持っています。

XMLで表現することを考えましたが、ファイルサイズが問題になることがあります。

私はここで私のアプローチでポットミスをしているかもしれません - 私は正しい道にいるか、そのような大きなデータコレクションを操作するためのより良い実行方法がありますか?

ここで重要な問題は、パフォーマンス(反応時間など)とデータの冗長性と完全性です。明らかに私はディスクにデータを保存する必要があります。

+0

タイトルに「C#」などのプレフィックスを付けないでください。それがタグのためのものです。 –

+0

これは7500 x 30000の数値の行列ですか、それとももっと複雑なものを表していますか?あなたの質問に対する良い答えは、このテーブルまたはマトリックスの内容と構造に関するより多くの情報に依存します。 –

+0

29998列には1または0が含まれ、残りの2つには文字列が含まれます。 – petestar

答えて

3

あなたはテーブル/マトリックス上で行う必要がある計算の性質を説明していないので、私はそこで仮定を行う必要がありますが、質問を正しく読んだら、たとえあなたのデータベースに実際の関係がない場合でも、リレーショナルデータベースを使用するための小文字のケースです。フルサーバーを使用できない場合は、埋め込みデータベースとしてSQL Server Compact Editionを使用します。これにより、選択した場合にプログラムで.SDFファイルを制御できます。

編集:
二考慮した後、私はデータベースのための私の提案を撤回。これは完全にテーブルの列の数が原因で、使用するリレーショナルデータベースにはこれに厳しい制限があり、驚くほど複雑ではない方法はありません。

あなたの編集に基づいて、私はあなたに興味を持っている三つのことがあると言う:

  1. 文書内の単語の存在を分析する方法は。これは、サンプルデータファイルの大部分です。主に文書内に単語が存在するかどうかを示すブール値です。
  2. 単語そのもの。これは、主にサンプルデータファイルの最初の行に含まれています。
  3. 文書とその分類を識別する手段。これは、データファイルの最初と最後の列です。

少しそれについて考えた後に、これは私があなたのデータをモデル化する方法を次のとおりです。単語が存在する場合と

  1. 、私はそれは、複雑なオブジェクトモデルを避けるために最善だと感じ。あなたは両方向(列と行ごと)で純粋な計算をしたいと思っています。私の意見では、最も柔軟で潜在的なパフォーマンスの構造は、フィールドの単純な2次元配列です。

    var wordMatrix =新しいブール[numDocuments、numWords];

  2. 単語自体は、単語行列の2番目の列にインデックス結合されている配列またはstringのリストにある必要があります。上記の例ではnumWordsで定義されています。特定の単語をすばやく検索する必要があった場合は、特定の単語のインデックスをすばやく見つけるために、キーを単語として使用し、値をインデックスとしてDictionary<string, int>を使用できます。

  3. 文書IDは、同様に、最初の列にインデックス結合されたintの配列またはリストになります。私はドキュメントのIDがそこに整数値であると仮定しています。分類は類似の配列またはリストになりますが、私はenumのリストを使用して、分類の各可能な値を表します。単語検索と同様に、IDで文書を検索する必要がある場合は、Dictionary<int, int>を検索インデックスとして使用できます。

私はこのモデルでいくつかの前提を設定しました。特に、 "ドキュメントごと"ではなく、すべての方向で単語の存在を純粋に計算したいと思っています。私が間違っている場合は、2次元配列とモデルをドキュメント、つまりDocumentIdDocumentClasificationというフィールドを持つ単一のC#Documentクラスとインデックス結合された単純なブール値の配列単語リストに追加します。次に、これらの単語のリストと共に、これらのDocumentオブジェクトのリストを操作することができます。

好きなデータモデルを作成したら、それをディスクに保存するのが最も簡単です。ちょうどC#のシリアル化を使用してください。 XMLまたはバイナリを使用して保存することができます。バイナリは最小のファイルサイズを自然に与えます(私は200MBを少し上回り、30000ワードのリストのサイズを加えます)。ディクショナリ検索索引を含めると、おそらく120kBが追加されます。

+0

なぜデータベースは良いアイデアだろうと思いますか? – jalf

+0

SQLサーバーは大きなテーブルを保持できますか? – petestar

+0

行には問題はありませんが、列が問題になります。この勧告を行ったときに残念なことにそのことを考えることはありませんでした。 – Randolpho

関連する問題