vb.net - 由于内存中的 StringBuilder 实例过大,服务器停止

标签 vb.net performance stringbuilder

所以,我有这段代码从数据库中获取一堆数据,并对这些数据执行一系列计算。然而,这并不是导致停止的原因。当我获取所有已准备好的“最终”数据并将其写入文本文件时,就会停止。

文本文件中的每一行都是根据对其执行计算的数据创建的。每一行“对应”数据库中的一条记录。用户通常必须一次对大约 30-40,000 条记录执行此文件导出。现在,即使我使用 StringBuilder,这仍然会因为纯粹的大量记录而停止。

我当前在代码中所做的是创建一个 StringBuilder,将所有数据(计算后)附加到其中,将其转换为字符串,将其添加到要从函数返回的 List(Of String) 中,然后清除 StringBuilder,并对下一行执行相同的操作,直到创建并附加、转换每一行,然后插入到列表中为止。

然后,另一个类接收此 List(Of String) 并获取每个字符串并最终将其附加到文件中。

有谁知道如何改进此代码并使其不会每次都停止服务器?之所以直到现在才被发现,是因为我在本地测试时一次只测试了1-50条记录。

提前谢谢!

编辑:

r = Class.ExportFile(ID)
data = Encoding.ASCII.GetBytes(r.ResponseString)

Return File(data, "text/plain", r.DefaultFileName)

-斯科特

最佳答案

返回 IEnumerable 而不是大字符串或字符串列表,并一次向文件写入一行。这样您就可以惰性地评估数据,因此您不需要保留大量字符串。例如

IEnumerable<string> Process() {
   var rows = QueryTheDatabase();
   foreach(var row in rows) {
      yield return ProcessARecord(row);//process and build a string of
                                         //one row
    }
 }

调用者只需对返回的 IEnumerable 执行 foreach 并将每一行写入文件。

关于vb.net - 由于内存中的 StringBuilder 实例过大,服务器停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3392124/

相关文章:

ruby-on-rails - Redis hmget 超时

performance - 删除未使用的代码 Google Page Speed 和其他错误

asp.net - 在 ASP.NET 4 WebForms 中压缩和缩小 WebResource.axd 和 ScriptResource.axd

java - 通过正则表达式替换 StringBuilder 中的文本

c# - 如何在 StringBuilder 上添加 CheckBoxList 项用于 Linq

.net - 从 RichTextBox 复制文本及其格式

vb.net - List.Contains 返回 false,即使它看起来应该返回 true

android - StringBuilder 似乎超出了容量

windows - VB.NET 上的唯一硬件 ID

c# - 关于 .NET 中的反射的完整教程?