全部,当我为固定文本文件生成一行时,我正在执行以下Append
formattedLine.Append(this.reversePadding ?
strData.PadLeft(this.maximumLength) :
strData.PadRight(this.maximumLength));
此特定异常发生在
PadLeft()
位置,其中this.maximumLength = 1,073,741,823
[从SQL Server收集的NVARCHAR(MAX)
的字段长度]。 formattedLine = "101102AA-1"
在发生异常时,为什么会这样。我应该允许的最大长度为2,147,483,647
吗?我想知道https://stackoverflow.com/a/1769472/626442是否是这里的答案-但是,我正在通过对任何一次性对象和
Dispose()
块进行适当的using
调用来管理任何内存,并在可能的情况下进行阻止。注意。此固定文本导出是在后台线程上完成的。
谢谢你的时间。
最佳答案
PadLeft()上会发生此特定异常,其中this.maximumLength = 1,073,741,823
对。因此,您正在尝试创建一个包含超过十亿个字符的字符串。
那是行不通的,我非常怀疑这是您真正想要做的。
请注意,.NET中的每个char
是两个字节,.NET中的字符串也以空值结尾...并且除数据(长度为1)之外还有其他一些字段。这意味着您至少需要2147483652字节+对象开销,这使您超出了每个对象2GB的限制。
如果您在.NET 4.5的64位版本的Windows上运行,则有一个特殊的app.config设置<gcAllowVeryLargeObjects>
,该设置允许大于2GB的阵列。但是,我认为这不会改变您的特定用例:
在应用程序配置文件中使用此元素可以启用大小大于2 GB的阵列,但不会更改对象大小或阵列大小的其他限制:
数组中元素的最大数量为UInt32MaxValue。
对于字节数组和单字节结构数组,任何单个维的最大索引为2,147,483,591(0x7FFFFFC7),对于其他类型,最大索引为2,146,435,071(0X7FEFFFFF)。
字符串和其他非数组对象的最大大小不变。
无论如何,您想对这样的字符串进行处理吗?
关于c# - 与PadLeft/Right OutOfMemoryException一起使用的StringBuilder,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13591110/