Производительность чтения и анализа строк в 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, а время для анализа строк будет пропорционально оставшемуся размеру файла.