2012-08-31 43 views
1

我必須每小時寫300多個文件到服務器共享。使用CreateText的快速實現每個文件大約需要1.4秒。我知道有一個更好的方法來做到這一點,但我不確定其中方式實際上是最快/最有效的;因此我的問題是:哪些文本寫入類是寫大量小文件最有效的?

哪個文本寫入類對於將數百個小文件(平均336字節)寫入服務器共享最有效?

回答

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(); 
     } 
    } 

而且我得到了以下的輸出: -

Output

文件計數爲3360輸出是: -

Loop1 16880.90 

Loop2 17285.55 
+0

你會使用什麼方法,不會覆蓋已經存在的文件(它不應該發生,但理論上它是可能的) –

+0

@RobertH: - Streamwriters專家覆蓋:)然而,你現在說什麼。 – perilbrain

+0

在寫入之前,檢查文件是否已經存在,如果確實存在,則通過以適當的方式區分文件名來打破平局。使用File.Exists(文件名)。 – Cyberherbalist

1

對此使用StreamWriter會很好。儘管你可能最好的做法是同時做很多事情,並讓操作系統以最有效的方式處理整個事件。

1

正如前面提到的使用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表達式註釋之後處理驗證已經保存的文件不明白任何東西:)

0

我做了一個實驗,其中我寫了一些任意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事情是你寫的,但似乎慢。