C# 如何处理非常大的数据库

C# 如何处理非常大的数据库,c#,.net,wpf,database,performance,C#,.net,Wpf,Database,Performance,我有一个数据表,其中可以放置数十万条记录。这是一个巨大的内存开销,因此我添加了一个功能,用户只能在我的应用程序中可视化前200条记录,并可以将其余结果导出到CSV文件 但是,为了导出到CSV文件,我使用的方法是将数据表的内容转换为CSV文件。由于我在DataTable中可以有超过100K条记录,我认为将所有记录放入DataTable并映射到CSV文件会占用大量内存。建议采取什么办法?这是我的CSV映射代码: StringBuilder builder = new StringBuilder();

我有一个
数据表
,其中可以放置数十万条记录。这是一个巨大的内存开销,因此我添加了一个功能,用户只能在我的应用程序中可视化前200条记录,并可以将其余结果导出到CSV文件

但是,为了导出到CSV文件,我使用的方法是将
数据表的内容转换为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());
StringBuilder=新建StringBuilder();
IEnumerable columnNames=dtResults.Columns.Cast().Select(column=>column.ColumnName);
AppendLine(string.Join(“,”,columnNames));
foreach(dtResults.Rows中的数据行)
{
IEnumerable fields=row.ItemArray.Select(field=>displaycomas(field.ToString());
AppendLine(string.Join(“,”字段));
}
File.writealText(文件名,builder.ToString());

我会回到老派,使用sqlcmd。比如:

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

丢弃数据表并使用数据读取器。按顺序读取您需要的记录,并在运行时构建CSV文件。

正如其他人所建议的,根据您的要求,避免在此处使用重量级数据表。因此,使用其提供商的数据读取器从源数据流传输数据将为您提供最佳性能,同时保持超薄的内存配置

我做了一些快速搜索,但没有找到任何csv库实现(有很多,远不是彻底的搜索)吹嘘使用DataReader的简单即插即用。但是,使用CSV库(我以前使用过FileHelpers和kbcsv并取得了成功)来处理文件写入、从查询中加载数据读取器、在开始循环之前告诉CSV编写器列名,然后让编写器处理将结果流式传输到磁盘,这将是相当简单的

在此过程中,您可能会得到一些内存增加,因为文件写入流可能会有一个合适的缓冲区,但它将比以数据表为中心的方法占用更少的内存。以这种方式使用具有大型结果集的datareader的唯一缺点是,长时间运行的查询可能会从ADO.NET数据提供程序中流失数据,但这是完全特定于提供程序的(但这是一个常见问题),如果您在数据库方面遇到问题,您可以研究这个问题


希望能有所帮助。

数十万条记录是“中等”的;不是“很大”。当您开始意识到需要在服务器上进行排序和分页等操作,而不是将所有内容都提取到
数据表中时,就是这个时候了。您在这里使用的数据库是什么?你在这里使用“数据库”和“CSV”作为同义词吗?@MarcGravel-用户可以将我的应用程序应用于他们选择的任何数据库,因此理论上它可以与可用的最大数据库一样大(尽管这些情况很少)。用户可以使用我的应用程序查询他们的数据库,并将查询结果视为从DataTable生成的DataGrid。然而,我想将数据表的内容导出到CSV文件中,但是我担心数据表可能会消耗太多内存;由于这个原因,
DataTable
很少在小型应用程序之外使用……如果对数据库执行IDataReader来进行输出,会怎么样?不应该产生巨大的内存开销。我想提出一个重要的事实,您正在控件中显示这个理论上很大的结果集。如果您希望允许这种类型的ui访问,则需要将记录虚拟化和流式处理结果用于网格。如果您认为构建CSV字符串会消耗大量内存,请等到看到呈现由相同数据填充的网格控件的消耗量时再考虑。不过,这可以在C#中使用吗?此外,我还想将结果导出到XML和Excel—此解决方案是否可以修改以支持这些格式,还是仅限于CSV?您忽略了上面提到的XML或Excel。对于XML,我将使用SELECTFORXML子句()。Excel可以打开.csv文件