6

基本的に巨大な正方行列である 10GB の CSV ファイルがあります。マトリックスの単一セルにできるだけ効率的にアクセスできる関数、つまりマトリックス[12345,20000]を作成しようとしています。

そのサイズを考えると、マトリックス全体を 2D 配列にロードすることは明らかに不可能です。ファイルから値を直接読み取る必要があります。

FileStream.Seek を使用してファイルのランダム アクセスを調べてみましたが、残念ながら変数の丸めにより、各セルは固定幅ではありません。特定のバイトを探して、ある種の算術演算でどのセルを見ているのかを知ることはできません。

ファイルをスキャンして、各行の最初のバイトのインデックスのルックアップ テーブルを作成することを検討しました。このようにして、matrix[12345,20000] にアクセスしたい場合は、行 12345 の先頭を探してから、行全体をスキャンし、正しいセルに到達するまでコンマを数えます。

私はこれを試してみようとしていますが、他の誰かがより良いアイデアを持っていますか? このようなファイルを処理しようとしたのは、私が初めてではないと確信しています。

乾杯

編集:ファイルには非常にまばらな行列が含まれていることに注意してください。CSV ファイルの解析が遅すぎる場合は、ファイルをより適切で処理しやすいファイル形式に変換することを検討します。スパース行列を格納する最良の方法は何ですか?

4

6 に答える 6

3

非常に大きな CSV ファイルに Lumenworks CSV リーダーを使用しました。ファイルをどれだけ速く解析できるかを確認する価値があるかもしれません。

ルーメンワークス CSV

于 2011-01-27T23:50:39.290 に答える
3

まず、特定の行をどのように参照しますか? 行のインデックスで、別のテーブルまたは関心のある行を知るのに役立つ何かがありますか? それともIDか何かによるものですか?

こういった考えが浮かびます

  • あなたのアプローチ
  • 二分探索。平均の長さ (サイズ/行) があると仮定すると、バイナリ検索を使用して、順序付けられた識別子が行にあると仮定して行を見つけることができ、ヒットかミスかを知ることができます。
  • データベースにロード中!ところで、それを妨げているのは何ですか?無料のSQL Express を使用することもできます。また、サイズ制限を回避するために、データを複数のデータベースに分割することもできます。
于 2011-01-27T23:56:10.727 に答える
1

インデックスファイルは、あなたができる最善の方法です。きっと。行のサイズが不明なため、ファイルをスキャンするかインデックスを作成する以外に、その行に直接スキップする方法はありません。

唯一の問題は、インデックスの大きさです。大きすぎる場合は、(たとえば) 5 行ごとにのみインデックスを作成し、5 行の範囲でスキャンすることで、サイズを小さくすることができます。

于 2011-01-27T23:54:05.860 に答える
0

特に64ビットOSを使用している場合は、ファイルをRAMにロードしないでください。

サイズ 12345x20000 の行列を割り当てることは問題ではありません。これは、倍精度で約 1.9 GB しかありません。実際、サイズが大きくなったとしても、64 ビット プラットフォームではこのアプローチをお勧めします (「仮想メモリ」を参照)。

次に、マトリックスがスパースであると述べたので、RAM にロードできますが、スパース表現を使用してメモリを節約できます。

結論として、アプリケーションがマトリックスに多くのアクセスを必要とし、パフォーマンスがある程度重要である場合、それを RAM に配置することは間違いなく私のお気に入りのアプローチです。

于 2011-01-28T00:52:56.530 に答える
0

フィールドが固定幅になるようにファイルを前処理します。次に、ランダム読み取りを簡単に行うことができます。

過去に同様のことを行った結果、10G の可変幅ファイルをローカル ディスクから読み取り、10G の固定幅ファイルをローカル ディスクに数分 (~20) で書き込む簡単なコードを作成できるはずです。その先行投資が報われるかどうかは、実行する必要があるランダム読み取りの数と、読み取るファイルが変更される頻度によって異なります。

于 2011-01-28T00:56:03.953 に答える
0

Lazy インスタンス化で読み取られる 12345 個の個別のファイルを作成した場合はどうなるでしょうか。各ファイルは、データが必要な場合にのみ読み取られます。データが完全にまばらな場合は、IsEmpty bool プロパティを使用してデータ構造を作成できます。

同じ要素に何度もアクセスする必要がありますか、それとも各要素を 1 回だけ読み取る必要がありますか?

于 2011-01-28T04:29:03.760 に答える