1

DataTable何十万ものレコードを配置できる があります。これはメモリのオーバーヘッドが大きいため、ユーザーがアプリケーションで上位 200 レコードのみを視覚化し、残りの結果を CSV ファイルにエクスポートできる機能を追加しました。

ただし、CSV ファイルにエクスポートするには、私が使用している方法では、a の内容をDataTableCSV ファイルに変換します。DataTable には 100K を超えるレコードを含めることができるため、すべてのレコードを DataTable に配置して CSV ファイルにマップするには、メモリを大量に消費すると思います。どのようなアプローチが推奨されますか? これは私のCSVマッピングコードです:

StringBuilder builder = new StringBuilder();

            IEnumerable<string> columnNames = dtResults.Columns.Cast<DataColumn>().Select(column => column.ColumnName);
            builder.AppendLine(string.Join(",", columnNames));

            foreach (DataRow row in dtResults.Rows)
            {
                IEnumerable<string> fields = row.ItemArray.Select(field => DisplayCommas(field.ToString()));
                builder.AppendLine(string.Join(",", fields));
            }

            File.WriteAllText(filename, builder.ToString());
4

3 に答える 3

0

DataTable を破棄し、DataReader を使用します。必要なレコードを順番に読み取り、CSV ファイルを作成します。

于 2013-02-22T00:57:18.653 に答える
0

私は古い学校に行き、sqlcmdを使用します。何かのようなもの:

sqlcmd -q "select field1,field2,field3 from mytable" -oc:\output.csv -h-1 -s","

http://msdn.microsoft.com/en-us/library/ms162773.aspx

于 2013-02-22T00:55:28.530 に答える
0

他の人が示唆しているように、ここで重い DataTable を使用することは、要件を考慮して避けるべきです。そのため、プロバイダーのデータ リーダーを使用してソースからデータをストリーミングすると、スリムなメモリ プロファイルを維持しながら最高のパフォーマンスが得られます。

私はいくつかの簡単な検索を行いましたが、DataReader を使用した簡単なプラグアンドプレイを宣伝する csv ライブラリの実装を見つけることができませんでした (徹底的な検索とはほど遠いものがたくさんあります)。ただし、ファイルの書き込みを処理し、クエリからデータリーダーをロードし、ループを開始する前にcsvライターに列名を伝え、次に結果をディスクにストリーミングする処理をライターに任せるだけです。

ファイル書き込みストリームにはおそらくまともなバッファがあるため、この間にメモリがいくらか増加する可能性がありますが、データテーブル中心のアプローチよりもメモリ消費量がはるかに少なくなりますこの方法で大きな結果セットを持つ datareader を使用することで実際に確認できる唯一の欠点は、実行時間の長いクエリが ADO​​.NET データ プロバイダーから潜在的に持つ可能性があるドレインですが、それは完全にプロバイダー固有 (しかし一般的な問題) です。このルートをたどると、データベース側に問題があるかどうかを調べることができます。

それが役立つことを願っています。

于 2013-02-22T12:38:11.007 に答える