我通过添加类型列来定义DataTable。我希望DataTable的行数在100万到300万之间。
我正在使用Microsoft的TextFieldParser(因为它支持多种固定宽度格式,通过Peek方法),以填充DataTable的行。
我想进行某种操作,将DataTable中的行复制到镜像SQL表中。
如果我填充整个DataTable,然后使用SqlAdapter和SqlCommandBuilder更新SQL表,如上所述here我的内存不足。
我该如何做到这一点?
答案 0 :(得分:2)
不建议将DataTable用于1M行,您可以简单地为INSERT创建新的SqlComand并使所有表字段成为参数并在循环中运行此命令。
但是,如果您已经使用DataTable编写了大量代码,则可以将其视为缓冲区,并具有以下解决方法:
1)就您读取数据行而言,检查到目前为止已经读取了多少行
2)一旦获得10K行,就执行DataTable.Update();
(您可以将此参数称为buffer_size并将其置于配置中以避免硬编码)
3)然后通过调用
清理DataTable中的所有数据DataTable.Clear();
DataTable.AcceptChanges();
4)你继续从文件中读取数据,循环重复
此外,如果不知道文件的结构和应用程序的目的,很难提出一般性建议,我只回答了在使用非常大的数据集时如何避免“内存不足”的问题。但我还建议考虑所有可能的选项,以避免使用.NET数据表作为数据的中间存储,并直接使用SQL Server提供的所有可能方式处理文件,例如
1)BULK INSERT - http://msdn.microsoft.com/en-us/library/ms188365.aspx
2)bcp实用程序 - http://msdn.microsoft.com/en-us/library/ms162802.aspx
3)MS SQL Intergartion Services - http://msdn.microsoft.com/en-us/library/ms141026.aspx
使用任何这些命令和工具的批量插入操作都可以从.NET启动。