我必须将大量数据写入字符串,然后将其保存到文件中。
我做了很多测试,看起来,当文件大小达到100 mb时,一切正常,没有异常被抛出。
但是,如果字符串变大,我会得到指向字符串的内存不足异常。
如何增加此字符串的大小限制?
答案 0 :(得分:3)
大小限制不在于字符串本身,而在于您如何使用内存。字符串具有的唯一限制是32位长度属性,将其大小限制为2 GB。
内存不足异常不是来自一个字符串太大,而是来自同时有太多大字符串。
我运行一个简单的测试,通过连接加倍来创建一个大字符串:
string x = "XXXXXXX";
while (true) {
Console.WriteLine(x.Length);
x = x + x;
}
在我收到异常之前,我可以创建一个896 MB的字符串。程序尝试分配1.75 GB字符串时会出现异常。这表明它不仅是导致异常的字符串本身,而且是你的总内存负载。
字符串是不可变的,这意味着当您通过连接字符串来构建字符串时,字符串将不会增长,每次都会创建一个新字符串。如果你没有释放以前使用的字符串(让它们超出范围或删除它们的引用),那么它们将保留在内存中。
你可以使用StringBuilder
来构建一个比连接字符串更好的字符串,但是因为问题似乎是你在内存中的其他东西我不会期望有很大的改进。
你可以使用List<string>
,这样你就有了很多较小的字符串,而不是一个巨大的字符串。这类似于StringBuilder
的工作方式,但它可能会更好地构建字符串。
如果您可以直接将字符串写入文件而不是首先构造整个字符串,那么就可以解决内存问题。尽管写入文件的速度很慢,但整个过程实际上可能会更快一些,因为你只需要重新安排实际的工作(无论如何都要写文件),你就可以摆脱分配大内存区域的工作。
如果构造字符串是工作密集型的,您可能希望查看异步执行文件写入。这样,当您写入文件时,您将能够构建文本的下一部分。
答案 1 :(得分:0)
如果只需要将所有内容保存到文件中,为什么不直接使用FileStream
并直接写入文件?