2016-11-14 57 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