增加字符串的最大大小
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
的工作方式,但它可能更适合您构建字符串的方式。
如果您可以将字符串直接写入文件而不是首先构建整个字符串,那么内存问题就会得到解决。虽然写入文件很慢,但整个过程实际上可能会快一些,因为你只是重新安排实际工作(无论如何你都会写文件),并且你摆脱了分配大内存区域的工作。
如果构建字符串需要大量工作,您可能需要考虑异步写入文件。这样您就可以在写入文件的同时构建文本的下一部分。
我必须将大量数据写入字符串,然后将其保存到文件中。
我做了很多测试,似乎当文件大小达到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
的工作方式,但它可能更适合您构建字符串的方式。
如果您可以将字符串直接写入文件而不是首先构建整个字符串,那么内存问题就会得到解决。虽然写入文件很慢,但整个过程实际上可能会快一些,因为你只是重新安排实际工作(无论如何你都会写文件),并且你摆脱了分配大内存区域的工作。
如果构建字符串需要大量工作,您可能需要考虑异步写入文件。这样您就可以在写入文件的同时构建文本的下一部分。