增加字符串的最大大小

本文关键字:字符串 增加 | 更新日期: 2023-09-27 18:08:16

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

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

然而,如果字符串变大,我得到一个指向该字符串的内存不足异常。

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

增加字符串的最大大小

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

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

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

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

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

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

您可以使用StringBuilder来构建一个比连接字符串更好的字符串,但由于问题似乎是您在内存中拥有的其他内容,我不期望有很大的改进。

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

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

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

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