Производительность чтения и анализа строк в C# и Unity

Фон

Во-первых, у меня есть текстовый файл (CSV) с несколькими столбцами и сотнями тысяч строк. Общий размер файла составляет 10 МБ. Я использовал ресурс с Unity, поэтому он загружается как текст

Связанный код:

TextAsset txtData = Resources.Load("data.csv") as TextAsset;
string txt = txtData.text;
strReader = new StringReader(txt);
string line0 = strReader.ReadLine();

....

currentLine =strReader.ReadLine();
while (true) {// if last line is nothing we quit
    var values = currentLine.Split(',');    
    try {
        float x = (float)Convert.ToSingle(values[colX]);
        float y = (float)Convert.ToSingle(values[colY]);
        float z = (float)Convert.ToSingle(values[colZ]);
        float w = (float)Convert.ToSingle(values[colSize]);
        runningList.Add(v1);
    }catch(Exceptoion e){
    }
    currentLine = strReader.ReadLine();
}

проблема

Было обнаружено, что чтение и синтаксический анализ являются медленными, что влияет на визуальный эффект Unity. Поэтому я использовал файл журнала, чтобы увидеть. Я считаю время на каждые 500 строк. Как ни странно, последняя группа занимает 12 мс (500 строк), вторая из последних занимает 20 мс, время для первой группы линейно увеличивается до 1,5-1,7 с.

Больше информации

Когда Unity рисует с частотой 90 Гц, я использую поток для чтения строки и анализа данных.

Вопрос

Где мне искать проблемы? Я использовал ресурс Unity, считыватель строк, разбиение, разбор для плавания. Где причина и есть ли способ ее улучшить?

Это выглядит странно, так как время сокращается.

Обновить

после того, как я использовал считыватель файлового потока, это 2ms каждой группы. Так это Unity TextAsset?

0 ответов

Учитывая поведение, это почти ошибка C# при чтении текстовых файлов Linux.

C# ожидает \r\n, но в Linux есть только \n. Тогда разумно, чтобы каждая прочитанная строка прошла весь файл и обнаружила, что это файл Linux, а время для анализа строк будет пропорционально оставшемуся размеру файла.

Другие вопросы по тегам