2009-06-18 33 views
0

我想導出一個字符串到一個文本文件,它有超過一百萬條記錄,如果我使用循環,它需要3分鐘才能導出到文本文件中。StringDictionary到TextFile

有沒有辦法做得更快?

問候

+0

需要更多信息.... – 2009-06-18 11:42:12

+1

您現在使用的導出方法是什麼? – Steef 2009-06-18 11:43:12

回答

4

嗯,這取決於你使用的是什麼格式的出口,但在一般情況下,導出大量數據的最大的開銷將是I/O。您可以通過使用更緊湊的數據格式減少這一點,並通過這樣做在內存中的數據較少操作(以避免存儲副本),如果可能的話。

首先要檢查的是看你的磁盤I/O速度,並做一些寫作代碼分析。

如果您正在使磁盤I/O達到最大(例如,以很高的磁盤速度百分比寫入,現代系統上的速度會達到每秒幾十兆字節),那麼可以考慮在您之前壓縮數據寫下來。這會使用更多的CPU,但是當您這樣做時,可以少寫入磁盤。如果您在閱讀方面有相同的瓶頸,這也可能會提高閱讀文件的速度。

如果你杏你的CPU,你需要寫它之前做的少的數據處理工作。例如,如果您使用的是序列化庫,避免這種情況並切換到更簡單,更專用的數據格式可能會有所幫助。考慮你需要的最簡單的格式:可能只是字符串長度的一個單詞,後面是字符串數據本身,對每個鍵和值重複。

3

注意,大多數字典結構不保留插入順序 - 這往往使他們糟糕的選擇,如果你想重複的文件內容,但(視大小而定),我們也許能夠改善的時間....這個(下)需要大約3.5秒(爲出口)寫不到30MB:

StringDictionary data = new StringDictionary(); 
    Random rand = new Random(123456); 
    for (int i = 0; i < 1000000; i++) 
    { 
     data.Add("Key " + i, "Value = " + rand.Next()); 
    } 
    Stopwatch watch = Stopwatch.StartNew(); 
    using (TextWriter output = File.CreateText("foo.txt")) 
    { 
     foreach (DictionaryEntry pair in data) 
     { 
      output.Write((string)pair.Key); 
      output.Write('\t'); 
      output.WriteLine((string)pair.Value); 
     } 
     output.Close(); 
    } 
    watch.Stop(); 

很明顯的表現將取決於能否寫入的實際數據的大小。