2016-11-14 39 views
0

使用C#我正在將文本文件中的數據讀取到二維列表中以供進一步處理。每個文件是256個雙打,以256行分隔的空格,每行讀入一個雙打列表,每個列表被添加到行列表中。所有文件都有256x256 = 65,536個數據點。從文本文件讀取雙數據 - 讀取時間的差異

我有讀取文件的代碼,適用於某些文件,但對於其他文件需要很長時間。由於所有文件都以相同的方式格式化,幷包含相同數量的數據點,我不明白讀取時間的差異,因此任何人都有什麼想法?

如何加快文件2的讀取時間?

這裏是我使用的代碼:

 private Data ReadData (string name, string file) 
     { 
      List<List<Double>> data_points = new List<List<Double>>(); 

      String input = File.ReadAllText(file); 

      foreach (string row in input.Split('\n')) 
      { 
       List<Double> line_list = new List<double>(); 
       foreach (string col in row.Trim().Split(' ')) 
       { 
        if(row != "") 
        { 
        line_list.Add(double.Parse(col.Trim())); 
        } 

       } 
       if(line_list.Count > 1) 
       { 
       data_points.Add(line_list); 
       } 
      } 

      Data temp_data = new Data(name, data_points); 
      return temp_data; 
     } 

示例文本文件的位置:

https://www.dropbox.com/s/diindi2qjlgoxep/FOV2_t1.txt?dl=0 =>讀取速度快

https://www.dropbox.com/s/4xrgdz0nq24ypz8/FOV2_t2.txt?dl=0 =>讀取慢

在回答對一些評論: @AntDC - 什麼構成了有效的雙重?我嘗試用Convert.ToDouble替換Parse.Double,但沒有任何改進。

@亨克霍爾特曼 - 讀取時間的差異非常明顯< 1秒的第一個文件和約。 50秒爲第二個文件。它似乎是可重複的。

@Slai - 我將這兩個文件都移到了其他位置,它對讀取時間沒有影響。兩個文件都在幾秒鐘內從同一個程序中導出。

+0

是否所有thye值都有效雙打? Double.Parse對無效雙打可能會很慢。 – AntDC

+0

指定「很長時間」。關於其他情況。這是可重複的嗎?你如何衡量,你做了什麼來消除GC和I/O文物? –

+0

好像文件是碎片的,這意味着文件散佈在硬盤的多個部分,而不是僅僅一個連續的區域。您可以運行磁盤碎片整理程序,或將這些文件複製到新位置。 – Slai

回答

2

性能明智,你可以優化你的代碼,而不是讀取整個文件,然後分解它。只需逐行閱讀。

List<Double> line_list = new List<double>(); 
foreach (string line in File.ReadLines("c:\\file.txt")) 
{ 
    string[] rows = line.Trim().Split(' '); 

    foreach(string el in rows) 
    { 
     line_list.Add(double.Parse(el.Trim())); 
    } 
} 
+0

謝謝我以後發現問題類構造函數,但我也實現了這種改變來提高性能。 –

+0

@MCrozier如果幫助你,你可以接受答案。 – mybirthname