作者热门文章
- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在用 C# 创建一个方法,它为 Google Product Feed 生成一个文本文件。 .提要将包含超过 30,000 条记录,文本文件目前的大小约为 7Mb。
这是我目前正在使用的代码(为简洁起见删除了一些行)。
public static void GenerateTextFile(string filePath) {
var sb = new StringBuilder(1000);
sb.Append("availability").Append("\t");
sb.Append("condition").Append("\t");
sb.Append("description").Append("\t");
// repetitive code hidden for brevity ...
sb.Append(Environment.NewLine);
var items = inventoryRepo.GetItemsForSale();
foreach (var p in items) {
sb.Append("in stock").Append("\t");
sb.Append("used").Append("\t");
sb.Append(p.Description).Append("\t");
// repetitive code hidden for brevity ...
sb.AppendLine();
}
using (StreamWriter outfile = new StreamWriter(filePath)) {
result.Append("Writing text file to disk.").AppendLine();
outfile.Write(sb.ToString());
}
}
我想知道 StringBuilder 是否是完成这项工作的正确工具。如果我改用 TextWriter,性能会有所提升吗?
我对 IO 性能知之甚少,因此不胜感激任何帮助或一般改进。谢谢。
最佳答案
文件 I/O 操作通常在现代操作系统中得到了很好的优化。您不应该尝试在内存中为文件组装整个字符串……只需将其逐个写出即可。 FileStream
将负责缓冲和其他性能方面的考虑。
您可以通过移动轻松地进行此更改:
using (StreamWriter outfile = new StreamWriter(filePath)) {
到函数的顶部,并摆脱直接写入文件的 StringBuilder
。
应避免在内存中构建大字符串的原因有多种:
StringBuilder
必须在您写入时增加其容量,从而导致内存的重新分配和复制。StringBuilder
内容写入文件,您必须使用 ToString()
这有效地加倍了进程的内存消耗,因为两个副本都必须在内存中一段的时间。如果您的地址空间非常碎片化,则此操作也可能会失败,以至于无法分配单个连续的内存块。关于c# - 如何在 C# 中高效地编写大型文本文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3407216/
我是一名优秀的程序员,十分优秀!