【问题标题】:StringBuilder out of memory, alternatives?StringBuilder 内存不足,替代方案?
【发布时间】:2016-01-20 20:45:59
【问题描述】:

我们有一个应用程序可以导出非常长的 CSV 文件,包括数千到数百万行。我们使用 StringBuilder 和大量 .Appends 来构建文件,这会耗尽大约 500,000 行的内存。 StringWriter 基于 StringBuilder,在我的测试中同时失败。

MemoryStream(或 Tributary)在处理这么大的文件时应该不会有任何问题,但它的 API 基于 byte[]。我知道I can convert,但这使得代码有点(很多?)更难阅读。

是否有更简单的解决方案可以将多个字符串写入我缺少的流,或者可能是实现此类功能的干净方法(可能是扩展?)

【问题讨论】:

  • 您真的需要将数据全部保存在内存中,为什么不直接将其写入您要导出的文件中?
  • 按照我的理解,当添加到字符串并因此超出最大容量时,StringBuilder 将尝试在“空间”用完之前将其容量加倍,然后才“安顿下来”足以容纳当前字符串加上加法。我的猜测是尝试加倍是您发生错误的地方。 StringBuilder 有一个 Capacity 属性。如果您大致知道所需的大小,请将其设置为不必在内存中调整大小。
  • 强制应用程序作为 64 位应用程序运行,并使用 Framework 4.5。这是一个可能有帮助的 SE:stackoverflow.com/questions/1087982/…
  • @Joni - 这是同一个问题 - 我如何将大量字符串写入 X,无论 X 是 MemoryStream、FileStream 还是 DeflateStream。
  • 如果是这样的话,你为什么不分块阅读呢?然后您可以执行您的操作,然后继续阅读...

标签: vb.net stringbuilder memorystream


【解决方案1】:

只是这样有一些结束:马克的答案是我正在寻找的答案。通过使用 StreamWriter 构建流,它可以工作。 StringWriter 失败。我仍然有一些编码问题,但相比之下这些都是次要的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-01
    • 2016-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多