增加字符串的最大大小

Cat*_*ata 1 c# string size out-of-memory

我必须将大量数据写入字符串,然后将其保存到文件中。

我做了很多测试,似乎当文件大小达到100 mb时,一切正常,没有抛出异常。

但是,如果字符串变大,我会收到指向该字符串的内存不足异常。

如何增加该字符串的大小限制?

Guf*_*ffa 5

大小限制不在于字符串本身,而在于如何使用内存。该字符串的唯一限制是 32 位长度属性,该属性将其大小限制为 2 GB。

内存不足异常并不是因为一个字符串太大,而是因为同时有太多大字符串。

我运行一个简单的测试,通过连接将自身加倍来创建一个大字符串:

string x = "XXXXXXX";
while (true) {
  Console.WriteLine(x.Length);
  x = x + x;
}
Run Code Online (Sandbox Code Playgroud)

在出现异常之前,我可以创建一个 896 MB 的字符串。当程序尝试分配 1.75 GB 字符串时会出现异常。这表明不仅是字符串本身导致了异常,而且还导致了总内存负载。

字符串是不可变的,这意味着当您通过连接字符串构建字符串时,该字符串不会增长,每次都会创建一个新字符串。如果您不释放以前使用的字符串(让它们超出范围或删除它们的引用),那么它们将保留在内存中。

您可以使用 aStringBuilder来构建一个比连接字符串更好的字符串,但由于问题似乎是您内存中的其他内容,因此我预计不会有很大的改进。

您可以使用 aList<string>来获得许多较小的字符串而不是一个巨大的字符串。这与工作方式类似StringBuilder,但它可能会根据您构造字符串的方式效果更好。

如果您可以将字符串直接写入文件,而不是首先构造整个字符串,那么就可以解决内存问题。尽管写入文件很慢,但整个过程实际上可能会更快一些,因为您只需重新安排实际工作(无论如何都会进行文件写入),并且摆脱了分配大内存区域的工作。

如果构造字符串是工作密集型的,您可能需要考虑异步写入文件。这样,您就可以在写入文件时构建文本的下一部分。