1

我必须每小时将 300 多个文件写入服务器共享。使用 CreateText 快速实现每个文件大约需要 1.4 秒。我知道有更好的方法可以做到这一点,但我不确定哪种方法实际上是最快/最有效的;因此我的问题:

哪个文本写入类最有效地将数百个小文件(平均 336 字节)写入服务器共享?

4

4 回答 4

1

我会推荐File.WriteAllText Method .Lesson 是,让 C# 以它自己的方式来做,因为实现者必须关心性能。

我尝试使用以下代码对两个函数进行基准测试(如果您有更好的代码,请随时提出建议):-

class Program
    {       
        static void Main(string[] args)
        {
            const int _max = 1000000;
            string data = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
            string path="First\\" + "txt";
            string path2 = "Second\\" + "txt";
            var s1 = Stopwatch.StartNew();
            for (int i = 0; i < 336; i++)
            {
                File.WriteAllText(path+i, data);
            }
            s1.Stop();

            var s2 = Stopwatch.StartNew();
            for (int i = 0; i < 336; i++)
            {
                using (StreamWriter sw = new StreamWriter(path2+i))
                {                   
                        sw.WriteLine(data);                    
                }
            }
            s2.Stop();

            Console.WriteLine("Loop1 {0}\n",((double)(s1.Elapsed.TotalMilliseconds * 1000000) / _max).ToString("0.00 ns"));
            Console.WriteLine("Loop2 {0}\n", ((double)(s2.Elapsed.TotalMilliseconds * 1000000) / _max).ToString("0.00 ns"));
            Console.ReadKey();
        }
    }

我得到以下输出: -

输出

对于3360输出的文件计数是:-

Loop1 16880.90 

Loop2 17285.55 
于 2012-08-31T15:31:08.870 回答
1

为此使用 StreamWriter 会很好。不过,您可能最好的做法是并行执行其中的许多操作,并让操作系统以最有效的方式处理全部内容。

于 2012-08-31T15:32:08.487 回答
1

如前所述,使用并行编程/线程 - 基本上,如果您有 400 个循环和 4 个核心,它将在每个核心上执行 100 个循环等。我认为快速高效。

  //File name and list of string content
  var fileAndContent = new Dictionary<string, List<string>>();
  Parallel.ForEach(fileContent, currentFile => { File.WriteAllLines(currentFile.Key, currentFile.Value); });

请参阅下面的链接。

http://msdn.microsoft.com/en-us/library/dd460717

http://msdn.microsoft.com/en-us/library/dd460720

在括号中,您可以放置​​处理每个文件的逻辑。将您的文件路径和字符串内容添加到字典中 - 然后在括号内处理您保存文件的逻辑,无论哪种方式,您都可以使用并行编程做您需要的事情,并在 lambda 表达式注释之后处理括号内已保存文件的验证,如果您什么都不懂:)

于 2012-08-31T15:52:46.673 回答
0

我做了一个实验,我使用 StreamWriter.Write 和 File.WriteAllText 将一些长度为 1700 字节的任意 lorem ipsum 文本写了 300 次到 300 个不同的文本文件(你知道,file1.txt、file2.txt 等)。使用 StreamWriter 需要 251 毫秒,使用 WriteAllText 需要 161 毫秒。

这是我使用的基本代码:

string filename = @"c:\zfile";
Stopwatch sw = new Stopwatch();
sw.Start();
for (int x = 0; x < 300; x++)
{
    string newfn = filename + x.ToString() + ".txt";

    StreamWriter writer = new StreamWriter(newfn);
    writer.Write(text);
    writer.Close();
}
sw.Stop();
long em = sw.ElapsedMilliseconds;

Console.Write(em.ToString());

对于 File.WriteAllText,将 StreamWriter 代码替换为:

File.WriteAllText(newfn, text);

我不知道你在写这个CreateText是什么,但它似乎很慢。

于 2012-08-31T16:12:23.080 回答