我正在尝试将包含 100 万行和 45 列的 SQL Server 表导出到一个.csv文件,供用户通过 Web 界面下载,但需要很长时间,最终我不得不手动停止该过程。我使用 aSqlDataReader并在读者读取时写入文件以避免内存问题。该代码适用于小表(少于 3k 行),但大表继续运行,并且目标文件保持在 0 KB。using (spContentConn) { using (var sdr = sqlcmd.ExecuteReader()) using (CsvfileWriter) { DataTable Tablecolumns = new DataTable(); for (int i = 0; i < sdr.FieldCount; i++) { Tablecolumns.Columns.Add(sdr.GetName(i)); } CsvfileWriter.WriteLine(string.Join("~", Tablecolumns.Columns.Cast<DataColumn>().Select(csvfile => csvfile.ColumnName))); while (sdr.Read()) for (int j = Tablecolumns.Columns.Count; j > 0; j--) { if (j == 1) CsvfileWriter.WriteLine(""); else CsvfileWriter.Write(sdr[Tablecolumns.Columns.Count - j].ToString() + "~"); } }我使用了该线程中推荐的相同答案,但仍然不起作用。请帮忙。
1 回答
犯罪嫌疑人X
TA贡献2080条经验 获得超4个赞
从.NET文档中并不清楚是否具有有效的缓冲,因此当我需要读/写大量数据时FileWriter
我总是使用a代替。BufferedStream
使用流,您必须编写字节数据而不是字符串,但这只需要对代码进行少量调整。
看起来您正在DataTable
循环中读取和写入 a 的列,这会影响性能。由于在导出操作期间列的数量和顺序不会改变,因此请考虑使用位置索引来访问列值。一次写入一行而不是一次写入一列会更好。
最后,您正在使用数据读取器,因此它应该提供来自 SQL Server 的最佳数据吞吐量(显然,受到服务器和带宽的限制)。这也表明性能瓶颈在于将数据写入文件的方式。
作为比较,我在 60 秒内将 1,000,000 行(每行 45 列)写入一个文本文件。当然,我的代码不会从数据库中读取,但这仍然应该为您提供足够好的基线。
- 1 回答
- 0 关注
- 128 浏览
添加回答
举报
0/150
提交
取消