如何处理非常大的数据库

本文关键字:非常 数据库 处理 何处理 | 更新日期: 2023-09-27 18:00:41

我有一个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库实现(有很多,远不是详尽的搜索),这些实现都标榜使用DataReader可以轻松即插即用。然而,使用CSV库(我以前成功地使用过FileHelpers和kbcsv)来处理文件写入、从查询加载数据读取器、在开始循环之前告诉CSV编写器列名,然后让编写器处理将结果流式传输到磁盘,这将是相当琐碎的。

在此过程中,您可能会增加一些内存,因为文件写入流可能会有一个不错的缓冲区,但与以数据表为中心的方法相比,它将大大减少内存消耗。以这种方式使用具有大结果集的数据读取器,我真正能看到的唯一缺点是,长时间运行的查询可能会从ADO.NET数据提供程序中流失,但这完全是特定于提供程序的(但是一个常见的问题),如果您在数据库方面遇到问题,您可以在走这条路时进行调查。

希望能有所帮助。

我会老派,使用sqlcmd。类似于:

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

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

放弃DataTable并使用DataReader。按顺序读取所需的记录,并在执行过程中构建CSV文件。