Могу ли я читать файлы CSV быстрее, если я что-то изменю?Является ли readlines лучшим способом? - PullRequest
0 голосов
/ 26 апреля 2019

Редактировать: Спасибо @Progressive за помощь, я спешил написать и на этот раз нуждался в проверке орфографии;) Я удалил соединение с БД, и это была проблема с производительностью. Я посмотрю на код и посмотрю, смогу ли я что-нибудь сделать для ускорения этой части кода. Спасибо всем за идеи!

Я пытаюсь прочитать около 50-100 CSV-файлов с 5000-20000 строками. Это занимает много времени, мой вопрос: возможно ли выполнить мой код быстрее, возможно, с помощью streamread или любым другим методом? Текст в файле построен так 123456789; РОБЕРТ; 1; 2019-04-26; 01; 10; ЧАС; Париж Если первый сегмент - это идентификатор, второе имя, третья группа, четвертая дата, пятый час, шестое значение, а седьмое - это «час», чтобы определить, в каком формате это, восемь городов. Каждая строка представляет собой еще один час.

Фон в том, что я читаю файлы и вставляю их в SQL. Кстати, соединение SQL уже установлено.

Я пытался использовать File.ReadAllLines, но это было медленнее. Я переместил сохранения в DB во внешний цикл foreach, чтобы получить некоторую производительность. Это сделал немного. Тем не менее, чтение файла CSV из 10000 строк (600 КБ) занимает около 20 минут. Я также пытался создать класс с параметрами, которые я устанавливаю, не увеличивая производительность.

var filePaths = Directory.GetFiles(@"C:\temp\", "**.csv");

foreach (string s in filePaths)
{
    var lines = File.ReadLines(s).Skip(1);

    foreach (var csvLine in lines)

    {
        if (csvLine.Contains(";;;;;"))
        {
            break;
        }

        List<string> values = new List<string>(csvLine.Split(';'));


        string id = values[0];
        string date = values[3];
        var timestart = values[4];

        //Convert "01" to 01:00
        int result = Convert.ToInt32(timestart);
        TimeSpan hourTime = TimeSpan.FromHours(result);
        string fromTimeString = result.ToString("HH");

        //Set timestart and time end
        DateTime resultDate = DateTime.Parse(date);
        DateTime timeStart = resultDate.Add(hourTime).AddHours(-2);
        DateTime timeEnd = timeStart.AddHours(1);


        var year = timeStart.Year;
        var month = timeStart.Month;
        var day = timeStart.Day;
        var hour = timeStart.Hour;

        //set id
        string dataId = id.ToString();

        //set sum
        double sumValue = double.Parse(values[4]) * 10;
        /

        var hourValue = myDB.HourValues.Where(w => w.streamID == dataId && w.TimeStart == timeStart).FirstOrDefault();

        if (hourValue == null)
        {
            hourValue = new HourValues
            {
                streamID = dataId,
                TimeStart = timeStart,
                TimeEnd = timeEnd,
                YearInt = year,
                MonthInt = month,
                DayInt = day,
                HourInt = hour,
                ResultTime = DateTime.Now,
                SumValue = (decimal)sumValue,


            };
            myDB.HourValues.Add(hourValue);
        }
        else 
        {
            hourValue.OriginalSum = hourValue.OriginalSum ?? hourValue.SumValue;
            hourValue.ResultTime = DateTime.Now;
            hourValue.SumValue = (decimal)sumValue;
        }
    }

    myDB.SaveChanges();
}

Я бы хотел посмотреть, смогу ли я как-нибудь быстрее прочитать файлы. И я ценю любую помощь, которую я могу получить или узнать о коде.

1 Ответ

0 голосов
/ 26 апреля 2019

Вы всегда можете использовать многопоточность, чтобы сделать это возможным на современных компьютерах.

Вы можете использовать Parallel.For или Parallel.ForEach. это значительно улучшило бы скорость Вам просто нужно быть осторожным с этим примером, поскольку кажется, что порядок важен.

Но, учитывая природу Parallel, он может обращаться к массиву в любом порядке, поэтому вам нужно будет создать что-то, что учитывает это.

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

...