【发布时间】: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