2016-11-14 2 views
0

Использование C# Я читаю данные из текстовых файлов в 2D-список для дальнейшей обработки. Каждый файл имеет 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 - Что представляет собой действительный двойной? Я попытался заменить Parse.Double на Convert.ToDouble без улучшения.

@ Хенк Холтерман - разница во времени чтения очень заметна < 1 с для первого файла и ок. 50 секунд для второго файла. Кажется, это повторяемо.

@Slai - Я переместил оба файла в другие места, и это не повлияло на время чтения. Оба файла были экспортированы из одной и той же программы за считанные секунды.

+0

Все ли ценные значения действительны в два раза? Double.Parse может быть медленным для недействительных удвоений. – AntDC

+0

Укажите «действительно долгое время». Что касается другого случая. Это повторяемо? Как вы оцениваете, что вы сделали для устранения артефактов GC и I/O? –

+0

кажется, что файл (ы) фрагментирован, что означает, что файл распространяется на нескольких частях жесткого диска, а не только на одну смежную область. Вы можете запустить Disk Defragmenter или скопировать файлы в новое место. – 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

Смежные вопросы