我必須每小時寫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會很好。儘管你可能最好的做法是同時做很多事情,並讓操作系統以最有效的方式處理整個事件。
正如前面提到的使用parralel編程/線程 - 基本上如果你有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
內parinthesis你可以把你的邏輯來處理每個文件。添加到dictionairy你的文件路徑和字符串內容 - 然後處理你的邏輯保存文件的方式,或者你可以使用paralel編程來做你需要的東西,並且在lambda表達式註釋之後處理驗證已經保存的文件不明白任何東西:)
我做了一個實驗,其中我寫了一些任意lorem ipsum文本的長度爲1700字節300次300個不同的文本文件(你知道,file1.txt,file2.txt等) ,使用StreamWriter.Write和File.WriteAllText。它使用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());
備案。WriteAllText,與更換的StreamWriter代碼:
File.WriteAllText(newfn, text);
我不知道這CreateText事情是你寫的,但似乎慢。
你會使用什麼方法,不會覆蓋已經存在的文件(它不應該發生,但理論上它是可能的) –
@RobertH: - Streamwriters專家覆蓋:)然而,你現在說什麼。 – perilbrain
在寫入之前,檢查文件是否已經存在,如果確實存在,則通過以適當的方式區分文件名來打破平局。使用File.Exists(文件名)。 – Cyberherbalist