gpt4 book ai didi

c# - 如何在 C# 中高效地编写大型文本文件?

转载 作者:IT王子 更新时间:2023-10-29 04:02:56 26 4
gpt4 key购买 nike

我正在用 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

应避免在内存中构建大字符串的原因有多种:

  1. 它实际上可能表现更差,因为 StringBuilder 必须在您写入时增加其容量,从而导致内存的重新分配和复制。
  2. 它可能需要比物理分配更多的内存 - 这可能会导致使用比 RAM 慢得多的虚拟内存(交换文件)。
  3. 对于真正的大文件 (> 2Gb),您将用完地址空间(在 32 位平台上)并且永远无法完成。
  4. 要将 StringBuilder 内容写入文件,您必须使用 ToString() 这有效地加倍了进程的内存消耗,因为两个副本都必须在内存中一段的时间。如果您的地址空间非常碎片化,则此操作也可能会失败,以至于无法分配单个连续的内存块。

关于c# - 如何在 C# 中高效地编写大型文本文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3407216/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com