2012-02-17 13 views
3

DataTableの代替データ構造

文字列、整数、datetime、doubleなどの多くのタイプで構成される1つの "セット"。 多くのセットが動的に追加されます 情報がプルされる場所でセットが動的に取得されます

ここで明らかな解決策は、DataTableを使用することです。 datatable構造体を定義し、新しいセットを追加する必要があるたびに新しい行を追加します。必要に応じてデータテーブルからデータを引き出します。

実際に私は既にデータテーブルを使用して実装していますが、何らかの理由で非常に遅いという問題があります。これは数千から数百万回実行されるため、パフォーマンスが問題になる可能性があります。

パフォーマンスの優れたデータ構造の代替データ型がありますか?リスト<を使用して独自のクラスを構築する必要がありますか?

+0

データ型は再利用可能か、動的である必要がありますか?匿名型を使用できますか?また、ADO.NetとEntity Frameworkのように、DataBase、FileBase、QueueなどからDataを読み取っている場所に依存します。また、Entity Frameworkには多くのinbuilt機能があります。 – Lloyd

+0

Hey there、 データ型は再利用可能です。一度設定すると静的です。コースの実際のデータのみが変更され、エントリが追加および削除されます。私は匿名の種類が何であるか分かりません。 データは自己生成されており、何も読み取られていません – user1035217

答えて

6

ユースケースによっては、List<object[]>(動的スキーマについて言及しているので)を中央データ構造として使用することをおすすめしますが、後で必要な場合はスキーマ情報を自分で管理する必要があります。

UIにデータをバインドする必要がある場合、このアプローチでは手作業が増えるため、大量のデータのバックグラウンド処理に適しています。

これまで、このアプローチを使用しており、データテーブルと比較してデータを一括処理する場合、メモリの2/3と実行時間の80%を節約できました。

+0

ありがとう、ありがとうございました!私はこれがちょうどうまくいくと思う、私は前にオブジェクト[]で作業したことがない。 80%実行速度?それはより速いが、それほど多くはない。 – user1035217

+0

これは誤解であり、20%高速ではなく、 'DbDataReader'から' DataTable'コードまでの既存のオーバーヘッドのために80%高速化しています。 – ntziolis

+0

ああ、私はheheを参照してください、それは優れています。私はそれを実装し、どのようなパフォーマンスの向上が見られるかを見ていきます。ありがとう! – user1035217

2

このような問題に近づく方法の1つとして、メモリ内にsqliteデータベースを使用する方法があります。

最初は奇妙なことに思えますが、かなり複雑な構造をテーブルに入れることができ、SQLの力でデータを処理できます。 SQLiteは小さなlibなので、あなたのコードを膨らませることはありません。あなたのコードにDBを統合するのはちょっと奇妙かもしれませんが、putのパフォーマンスは巨大なデータセットで動作するはずです(これはDBのためです)。そのデータをディスクに保存する必要がある場合は、すでに完了しています。

問題の詳細によっては、大きなDBバックエンド(例:ポストグル)に移動することも良い考えですが、ここからは分かりません。このアイデアをあまりにも簡単に却下しないでください。