Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 字符串生成器和字符串大小_C#_String_Memory_Stringbuilder - Fatal编程技术网

C# 字符串生成器和字符串大小

C# 字符串生成器和字符串大小,c#,string,memory,stringbuilder,C#,String,Memory,Stringbuilder,为什么StringBuilder大小大于字符串~250MB 请阅读问题。我想知道字符串中大小约束的原因,但不想知道stringbuilder中的原因。我已经解决了读取文件的问题 是的,我知道有一些操作,我们可以在字符串生成器上执行,如追加、替换、删除等。但是,当我们无法从字符串中获取ToString并且无法直接将其写入文件时,它有什么用呢。我们必须让ToString实际使用它,但因为它的大小超出了字符串范围,所以会抛出异常 所以,当我将一个大约1GB的文件读入字符串生成器,但无法将其读入字符串时

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

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

是的,我知道有一些操作,我们可以在字符串生成器上执行,如追加、替换、删除等。但是,当我们无法从字符串中获取ToString并且无法直接将其写入文件时,它有什么用呢。我们必须让ToString实际使用它,但因为它的大小超出了字符串范围,所以会抛出异常

所以,当我将一个大约1GB的文件读入字符串生成器,但无法将其读入字符串时,字符串生成器的大小是否比字符串大。我阅读了StringBuilder的所有优点和缺点,但我无法解释这一点

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

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

更新: 我已经解决了我的问题,想知道为什么stringbuilder上没有内存限制。

您可以使用它从stringbuilder中获取大小较小的内容块

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

您可以使用从StringBuilder中获取大容量内容中较小的块

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

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

原因取决于.net的版本

Eric Lippert在这里提到了两个实现:

字符串生成器在内部维护字符[]。附加时,可能需要调整此数组的大小。为了防止每次追加时都需要调整其大小,它会调整到更大的大小,以预测将来追加的大小,实际上它的大小会加倍。因此,StringBuilder通常会比其内容更大,甚至是其大小的两倍

较新的实现维护char[]的链接列表。如果您添加了许多小的附件,那么链表的开销可能会额外增加250MB

在正常使用中,由于性能优势,字符串上的额外100%大小暂时不会产生任何影响,但是当您处理GB时,它会变得非常重要,而这不是它的预期用途

为什么你要离开记忆异常 链表实现比字符串更适合内存,因为它不需要一个1GB的连续块。当您使用字符串时,它会迫使它尝试寻找另一个GB,这也是连续的,这就是问题所在

为什么没有约束来阻止这一点? 嗯,有。约束条件是,如果ToString期间内存不足,无法创建字符串,则抛出OutOfMemoryException

您可能希望在追加操作期间发生这种情况,但这是不可能确定的。StringBuilder可以查看可用内存,但在调用ToString之前可能会发生变化。因此,StringBuilder的作者可以设置任意的限制,但这不能平等地适用于所有系统,因为有些系统的内存比其他系统多

您可能还希望在调用ToString之前执行减小StringBuilder大小的操作,或者根本不调用ToString!所以,仅仅因为StringBuilder太大,在任何时候都无法进行字符串转换并不是引发异常的原因

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

原因取决于.net的版本

Eric Lippert在这里提到了两个实现:

字符串生成器在内部维护字符[]。附加时,可能需要调整此数组的大小。为了防止每次追加时都需要调整其大小,它会调整到更大的大小,以预测将来追加的大小,实际上它的大小会加倍。因此,StringBuilder通常会比其内容更大,甚至是其大小的两倍

较新的实现维护char[]的链接列表。如果您添加了许多小的附件,那么链表的开销可能会额外增加250MB

在正常使用中,由于性能优势,字符串上的额外100%大小暂时不会产生任何影响,但是当您处理GB时,它会变得非常重要,而这不是它的预期用途

为什么你要离开记忆异常 链表实现比字符串更适合内存,因为它不需要一个1GB的连续块。当您使用ToString时,它将强制它尝试查找另一个GB,这也是连续的 这就是问题所在

为什么没有约束来阻止这一点? 嗯,有。约束条件是,如果ToString期间内存不足,无法创建字符串,则抛出OutOfMemoryException

您可能希望在追加操作期间发生这种情况,但这是不可能确定的。StringBuilder可以查看可用内存,但在调用ToString之前可能会发生变化。因此,StringBuilder的作者可以设置任意的限制,但这不能平等地适用于所有系统,因为有些系统的内存比其他系统多


您可能还希望在调用ToString之前执行减小StringBuilder大小的操作,或者根本不调用ToString!因此,仅仅因为StringBuilder太大而无法在任何时候进行字符串转换并不是引发异常的原因。

您可以尝试以下方法来处理大型XML文件。

您可以尝试以下方法来处理大型XML文件。

首先,为什么要将1GB文件加载到内存中?请阅读下面的线程。它说的是处理大型文本文件。在这种情况下,StringBuilder似乎不是一个好的解决方案。您可以使用toString,int生成较小的字符串。但为什么要在内存中放入这么多文本?你想干什么?有比在StringBuilder中执行所有操作更好的替代方法,例如使用内存映射文件、解析、使用文本生成器等。对于这项工作来说,这不是正确的工具,和/或不是解决问题的正确方法。你对X有问题,并且假设Y是解决方案,所以当你遇到麻烦时,你会问Y而不是X。您试图解决的实际问题是什么?首先,为什么还要将1GB文件加载到内存中?请仔细阅读。它说的是处理大型文本文件。在这种情况下,StringBuilder似乎不是一个好的解决方案。您可以使用toString,int生成较小的字符串。但为什么要在内存中放入这么多文本?你想干什么?有比在StringBuilder中执行所有操作更好的替代方法,例如使用内存映射文件、解析、使用文本生成器等。对于这项工作来说,这不是正确的工具,和/或不是解决问题的正确方法。你对X有问题,并且假设Y是解决方案,所以当你遇到麻烦时,你会问Y而不是X。您试图解决的实际问题是什么?我必须读取这么大的xml文件,如果我拆分这些数据,则无法将其加载到XMLDocument@AmanSeth您应该使用XmlReader而不是XMLDocument。XmlReader使用SAX模式进行处理,读取输入流中出现的元素和属性。它不会将整个文件加载到内存中—事实上,它可以轻松地处理网络流或任何类型的流—我必须读取一个如此大的xml文件,如果我将该数据拆分,则无法将其加载到内存中XMLDocument@AmanSeth您应该使用XmlReader而不是XMLDocument。XmlReader使用SAX模式进行处理,读取输入流中出现的元素和属性。它不会将整个文件加载到内存中——事实上,它可以轻松地处理网络流或任何类型的流。如果它不打算这样使用,则不应存在任何约束。那么,设计师将在哪里划定界限?他们将如何在运行时强制执行它。你可能会遇到这样的情况,一天它工作,第二天代码必须处理比限制大一个字节的输入,然后它抛出异常,这将是非常糟糕的。你说的是什么设计师。谢谢,这是一个很好的解释,字符串需要一块内存。但这仍然不是问题的答案。当我们知道我们无法获取大数据时,这是字符串,那么为什么要将字符串设置为大字符串呢?编写StringBuilder代码的.net framework的设计师。这不是问题的答案,您一直在更改您的问题!不管怎样,我已经补充了答案。如果它不打算像这样使用,是否应该有任何限制?设计师会在哪里划定界限?他们将如何在运行时强制执行它。你可能会遇到这样的情况,一天它工作,第二天代码必须处理比限制大一个字节的输入,然后它抛出异常,这将是非常糟糕的。你说的是什么设计师。谢谢,这是一个很好的解释,字符串需要一块内存。但这仍然不是问题的答案。当我们知道我们无法获取大数据时,这是字符串,那么为什么要将字符串设置为大字符串呢?编写StringBuilder代码的.net framework的设计师。这不是问题的答案,您一直在更改您的问题!无论如何,我已经添加了答案。我不想要一个读取xml文件的解决方案。我已经编写了一个新的代码,可以非常高效地读取这个巨大的文件,并将在很短的时间内与大家分享。在这里我想知道为什么
stringbuilder上没有内存限制。我不需要读取xml文件的解决方案。我已经编写了一个新的代码,可以非常高效地读取这个巨大的文件,并将在很短的时间内与大家分享。这里我想知道为什么stringbuilder没有内存限制。