Чтение двойных данных из текстового файла - разница во времени чтения

Используя С#, я читаю данные из текстовых файлов в 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 - я переместил оба файла в другие места, и это не повлияло на время чтения. Оба файла были экспортированы из одной и той же программы с интервалом в несколько секунд.


person M Crozier    schedule 14.11.2016    source источник
comment
Являются ли все твои значения действительными удвоениями? Double.Parse может быть медленным для недопустимых двойников.   -  person AntDC    schedule 14.11.2016
comment
Уточняйте очень давно. Что касается другого случая. Это повторяемо? Как вы измеряете, что вы сделали для устранения артефактов GC и ввода-вывода?   -  person Henk Holterman    schedule 14.11.2016
comment
похоже, что файл (ы) фрагментирован, то есть файл распределен по нескольким частям жесткого диска, а не только по одной непрерывной области. Вы можете запустить дефрагментацию диска или скопировать файлы в новое место.   -  person Slai    schedule 14.11.2016
comment
Я не могу воспроизвести разницу. Оба файла завершились примерно за 0,1 секунды в VS 2015 с вашим кодом перед строкой Data. Есть ли какие-либо файлы в общей папке или что-то связанное с конструктором класса Data?   -  person Slai    schedule 14.11.2016
comment
Слай, вы правы, проблема заключалась не в части чтения файла, а в конструкторе класса Data, который во втором случае занимал гораздо больше времени. Спасибо всем за ваши ответы.   -  person M Crozier    schedule 14.11.2016
comment
Кстати, вопросы по рабочему коду обычно лучше подходят для codereview.stackexchange.com (на случай, если у вас возникнут проблемы с оптимизацией класса Data конструктор)   -  person Slai    schedule 15.11.2016


Ответы (1)


С точки зрения производительности вы можете оптимизировать свой код, вместо этого читая весь файл и после этого разбивая его. Просто читайте построчно.

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()));
    }
}
person mybirthname    schedule 14.11.2016
comment
Спасибо, я обнаружил проблему позже в конструкторе класса, но я также реализовал это изменение для повышения производительности. - person M Crozier; 14.11.2016