我从数据库中获取数据并使用File.AppendAllText
将每个数据库行写入一个总共8000个文件的文件中。整个过程在循环(查询)中重复,似乎永远需要。有没有更好的方法来做这个?存储所有文件处理程序是否有意义?
答案 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)
它可能与几个参数有关,在以下情况下,并行性无济于事:
您还可以尝试在进程持续时间内保持目标文件处于打开状态,并在处理完所有源数据后关闭所有文件。这将避免每个用户/文件上的整个打开/写入/关闭循环。
答案 2 :(得分:1)
使用显式文件流时,您可以设置blocksize。 有时候我发现有时候改变块大小会对性能产生巨大的影响。
也许你也可以并行化读取SQL Server和写入磁盘。 例如,使用DataReader。
类似主要在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