我必须每小时将 300 多个文件写入服务器共享。使用 CreateText 快速实现每个文件大约需要 1.4 秒。我知道有更好的方法可以做到这一点,但我不确定哪种方法实际上是最快/最有效的;因此我的问题:
哪个文本写入类最有效地将数百个小文件(平均 336 字节)写入服务器共享?
我必须每小时将 300 多个文件写入服务器共享。使用 CreateText 快速实现每个文件大约需要 1.4 秒。我知道有更好的方法可以做到这一点,但我不确定哪种方法实际上是最快/最有效的;因此我的问题:
哪个文本写入类最有效地将数百个小文件(平均 336 字节)写入服务器共享?
我会推荐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
为此使用 StreamWriter 会很好。不过,您可能最好的做法是并行执行其中的许多操作,并让操作系统以最有效的方式处理全部内容。
如前所述,使用并行编程/线程 - 基本上,如果您有 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 表达式注释之后处理括号内已保存文件的验证,如果您什么都不懂:)
我做了一个实验,我使用 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是什么,但它似乎很慢。