这就是我想要实现的目标。循环遍历超过100万条记录的数据集,并在导出到C驱动器的文本文件中创建数据转储。
我正在遍历一个包含超过一百万条记录的数据集。下面是循环中的内容
我在循环中使用了StringBuilder。
myString.Append(ds.tables[0](i)(0)); <-- each datarow is not more than 10 char long.它抛出一个错误,指出内存不足。我有12 gb的内存。
我该如何着手解决这个问题?
发布于 2015-03-10 07:02:54
不要使用中间StringBuilder --在您可能对它调用.ToString()以将结果写入磁盘之前,它的内容就位于您的计算机的内存中。相反,应在处理数据时将其写入磁盘,如下所示:
using (var sw = new StreamWriter(outputFilePath, true))
{
// start loop
sw.Write(ds.tables[0](i)(0));
// end loop
}这将使用默认编码(UTF-8)和缓冲区大小(我认为是4KB)将文本写入文件。
发布于 2015-03-10 07:04:00
为什么要在内存中存储这个大字符串呢?如果你想做的就是把它写到一个文本文件中,你可以批量使用一个StreamWriter to write:
using(var writer = new StreamWriter("c:\\file.txt", true))
{
for(int rowNum = 0; rowNum < ds.tables[0].Rows.Count; rowNum++)
{
DataRow row = ds.Tables[0].Rows[rowNum];
writer.Write(row.Field<string>(0));
}
}但也许您可以进一步优化它。你真的需要大DataSet吗?如果数据来自数据库,那么您可以使用DataReader延迟地流式传输数据。然后,您可以在没有内存的情况下写入文本文件。
发布于 2015-03-10 06:53:38
这意味着CLR不能分配您请求的大小的对象。每个进程都有自己的内存限制,因此在您的计算机或任何标准计算机上,向StringBuilder追加一百万条记录可能是不可能的。
即使您有大量内存,即使您运行的是64位CLR,可以创建的对象的大小也是有限制的。
https://stackoverflow.com/questions/28953208
复制相似问题