首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >StringBuilder内存不足C#

StringBuilder内存不足C#
EN

Stack Overflow用户
提问于 2015-03-10 06:50:27
回答 4查看 687关注 0票数 3

这就是我想要实现的目标。循环遍历超过100万条记录的数据集,并在导出到C驱动器的文本文件中创建数据转储。

我正在遍历一个包含超过一百万条记录的数据集。下面是循环中的内容

我在循环中使用了StringBuilder

代码语言:javascript
复制
myString.Append(ds.tables[0](i)(0));  <-- each datarow is not more than 10 char long.

它抛出一个错误,指出内存不足。我有12 gb的内存。

我该如何着手解决这个问题?

EN

回答 4

Stack Overflow用户

发布于 2015-03-10 07:02:54

不要使用中间StringBuilder --在您可能对它调用.ToString()以将结果写入磁盘之前,它的内容就位于您的计算机的内存中。相反,应在处理数据时将其写入磁盘,如下所示:

代码语言:javascript
复制
using (var sw = new StreamWriter(outputFilePath, true)) 
{
    // start loop
        sw.Write(ds.tables[0](i)(0));
    // end loop
}

这将使用默认编码(UTF-8)和缓冲区大小(我认为是4KB)将文本写入文件。

票数 7
EN

Stack Overflow用户

发布于 2015-03-10 07:04:00

为什么要在内存中存储这个大字符串呢?如果你想做的就是把它写到一个文本文件中,你可以批量使用一个StreamWriter to write

代码语言:javascript
复制
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延迟地流式传输数据。然后,您可以在没有内存的情况下写入文本文件。

票数 3
EN

Stack Overflow用户

发布于 2015-03-10 06:53:38

这意味着CLR不能分配您请求的大小的对象。每个进程都有自己的内存限制,因此在您的计算机或任何标准计算机上,向StringBuilder追加一百万条记录可能是不可能的。

即使您有大量内存,即使您运行的是64位CLR,可以创建的对象的大小也是有限制的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28953208

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档