【发布时间】:2013-02-22 00:11:34
【问题描述】:
我有一个DataTable,其中可以放置数十万条记录。这是一个巨大的内存开销,所以我添加了一个功能,用户只能在我的应用程序中可视化前 200 条记录,并且可以将其余结果导出到 CSV 文件。
但是,为了导出到 CSV 文件,我使用的方法是将DataTable 的内容转换为 CSV 文件。由于我可以在 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());
【问题讨论】:
-
数十万条记录是“中等”;不是“非常大”。当你开始意识到你需要做一些事情,比如“在服务器上排序和分页”,而不是把所有的东西都提取到
DataTable中时,就差不多到了这一点。您在这里使用的数据库是什么?您在这里使用“数据库”和“CSV”作为同义词吗? -
@MarcGravell - 用户可以将我的应用程序应用于他们选择的任何数据库,因此理论上它可以与可用的最大数据库一样大(尽管这些情况很少)。用户可以使用我的应用程序来查询他们的数据库,并将他们的查询结果作为从 DataTable 生成的 DataGrid 查看。但是,我想将 DataTable 的内容导出到 CSV 文件,但是我担心可能存在 DataTable 会消耗太多内存的情况
-
确实;因此,
DataTable在小型应用程序之外很少使用... -
如果您对数据库执行 IDataReader 以进行输出怎么办?不应产生巨大的内存开销。
-
我想提出一个重要的事实,即您在控件中显示这个理论上很大的结果集。如果您想允许这种类型的 ui 访问,您将需要使用记录虚拟化和流式传输结果到网格。如果您认为构建 CSV 字符串会消耗大量内存,请等到您看到渲染从相同数据填充的网格控件的消耗。
标签: c# .net wpf database performance