所以,我有这段代码从数据库中获取一堆数据,并对这些数据执行一系列计算。然而,这并不是导致停止的原因。当我获取所有已准备好的“最终”数据并将其写入文本文件时,就会停止。
文本文件中的每一行都是根据对其执行计算的数据创建的。每一行“对应”数据库中的一条记录。用户通常必须一次对大约 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/