File.AppendAllText的C#速度

时间:2011-02-22 06:08:55

标签: c#

我从数据库中获取数据并使用File.AppendAllText将每个数据库行写入一个总共8000个文件的文件中。整个过程在循环(查询)中重复,似乎永远需要。有没有更好的方法来做这个?存储所有文件处理程序是否有意义?

4 个答案:

答案 0 :(得分:8)

documentation说“打开文件,将指定的字符串附加到文件,然后关闭文件”。
那就是你打开并关闭每一行的文件。

使用类似的东西

string[] dbRows = new string[] { "1", "2", "3" };
using (var file = new StreamWriter("file.txt", true))
{
    foreach (var row in dbRows)
    {
        file.WriteLine(row);
    }
}

答案 1 :(得分:3)

它可能与几个参数有关,在以下情况下,并行性无济于事:

  • 磁盘I / O:您只需使I / O更慢
  • 网络容量:一旦达到网络限制,您将同时获得多个文件,但整体速度不会改变

您还可以尝试在进程持续时间内保持目标文件处于打开状态,并在处理完所有源数据后关闭所有文件。这将避免每个用户/文件上的整个打开/写入/关闭循环。

答案 2 :(得分:1)

使用显式文件流时,您可以设置blocksize。 有时候我发现有时候改变块大小会对性能产生巨大的影响。

也许你也可以并行化读取SQL Server和写入磁盘。 例如,使用DataReader。

另请查看http://blogs.msdn.com/b/blogdoezequiel/archive/2011/02/11/best-practices-on-filestream-implementations.aspx

类似主要在SQL Server上,但在Generic

中的FileStreams上也有一些提示

答案 3 :(得分:0)

我正在处理相同的问题...写得越少越好,所以它与字节分配有关,可能比打开/关闭streamreader更多。

查看写入过程的不同频率和大小......

如果只编写500/1000/10000/100000长度的字符串,则性能会有所不同。在XYZ循环中,我发现最快的性能是写入200-300个字符的字符串需要我的测试大约5秒,而写入10000个字符需要大约30秒的SSD卡。

这与瓶颈是由写入频率造成的想法相矛盾! C# Performance - Chunking Write of file with AppendAllText