String Builder和字符串大小

XYZ*_*XYZ 1 c# memory string stringbuilder

为什么StringBuilder大小大于字符串(~250MB).

请阅读问题.我想知道字符串中大小约束的原因,但不知道在stringbuilder中.我已经修复了读取文件的问题.

是的,我知道有操作,我们可以在字符串构建器上执行如append,replace,remove等.但是当我们无法从它获取ToString()并且我们无法直接写入时,它的用途是什么文件.我们必须让ToString()实际使用它,但由于它的大小超出了字符串范围,因此抛出异常.

因此,特别是使用字符串构建器,其大小比字符串大,因为我将大约1 GB的文件读入字符串构建器但不能将其转换为字符串.我阅读了StringBuilder上StringBuilder的所有优点和缺点,但我无法解释这一点

更新: 我想从文件中加载XMLDocument,如果读入块,则无法加载数据,因为根级节点需要其关闭标记,该标记将位于其他块块中

更新: 我知道这不是一个正确的方法现在我是不同的过程,但我仍然想知道字符串大小约束的原因,但不是在stringbuilder

更新: 我已修复我的问题,并想知道stringbuilder上没有内存约束的原因.

Hei*_*nzi 5

您可以使用从StringBuilder中StringBuilder.ToString(int, int)获取较大尺寸的大块内容.

此外,您可能需要考虑是否真的使用正确的工具来完成工作.StringBuilder的目的是构建和修改字符串,而不是将大文件加载到内存中.


wes*_*ton 5

为什么StringBuilder Size大于string(〜250MB)。

原因取决于.net的版本。

埃里克·利珀特(Eric Lippert)在此处提到了两种实现方式:https : //stackoverflow.com/a/6524401/360211

在内部,字符串生成器维护char[]。当您追加时,可能必须调整此数组的大小。为了防止每次添加时都需要重新调整大小,以将其调整为更大的尺寸以预期将来的附加内容(实际上大小会加倍)。因此,最终结果StringBuilder往往大于其内容的大小,是其大小的两倍。

较新的实现会维护的链接列表char[]。如果您执行许多小的附加操作,则链表的开销可能会占用额外的250MB。

在正常使用中,考虑到性能方面的好处,字符串临时增加100%的大小不会产生一点区别,但是当您使用GB时,它变得很重要,而不是预期的用途。

你为什么得到 OutOfMemoryException

链表实现可以比a容纳更多的内存,string因为它不需要一个连续的1GB块。当您ToString迫使它尝试寻找另一个 GB时,它也是连续的,这就是问题所在。

为什么没有约束可以阻止这种情况?

好吧。约束是如果没有足够的内存来创建string期间ToString,则抛出OutOfMemoryException

您可能希望在Append操作过程中发生这种情况,但无法确定。StringBuilder可以查看可用内存,但是在调用之前可能会发生变化ToString。因此,的作者StringBuilder可以设置一个任意的限制,但是不能同等地适合所有系统,因为某些系统比其他系统具有更多的内存。

您可能还想做一些操作,以减小StringBuilder调用之前的大小ToString,或者根本不调用ToString!因此,仅仅因为StringBuilder它太大ToString而不能抛出异常。