增加字符串的最大大小

Increase maximum size of a string

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

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

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

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

如果您只需要将所有内容保存到一个文件中,为什么不直接使用 FileStream 并直接写入呢?

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

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

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

string x = "XXXXXXX";
while (true) {
  Console.WriteLine(x.Length);
  x = x + x;
}

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

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

您可以使用 StringBuilder 构建一个比连接字符串效果更好的字符串,但由于问题似乎出在您的内存中还有什么,我预计不会有很大的改进。

你可以使用 List<string> 这样你就有很多小的字符串而不是一个大的字符串。这类似于 StringBuilder 的工作方式,但它可能更适合您构建字符串的方式。

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

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