Скорость разбора файла ASCII - PullRequest
0 голосов
/ 20 ноября 2011

У меня есть два типа файлов. Одним из них является файл ASCII, и данные хранятся как;

X Y Value 
0 0 5154,4
1 0 5545455;
. . ...
. . ...

другой - бинарный файл.

Сначала я анализирую один метод StreamReader и ReadLine(), а затем устанавливаю значения в массив double[,] с помощью Split(' ').

Я разбираю второй с BinaryReader.

Разбор двоичного файла происходит в 3-4 раза быстрее, чем ASCII.

Вопрос 1: Чтение ASCII-файла происходит медленнее, чем двоичного. Это нормально?

Вопрос 2. Предлагаете ли вы другой способ анализа файла ASCII?

Ответы [ 3 ]

3 голосов
/ 20 ноября 2011

Это не столько чтение, сколько медленнее, а то, как вы это делаете.

Это анализ, поиск новых строк, разделителей, а затем преобразование фрагментов текста в другие форматы. BinaryReader - это в основном прямая копия памяти.

Это похоже на разницу между фиксированной длиной и csv, или csv и xml. Чем больше метаданных вы добавляете, тем больше вы можете получить их, но тем больше они стоят.

Чтение файла ascii символ за символом может работать быстрее, чем readline и split, так что вы можете оптимизировать его для вашей конкретной файловой структуры. Хотя много работы и очень хрупкая, что делает его сомнительной перспективой. Загрузка загрузки в отдельный поток, возможно, даже параллельная обработка строк, может быть более полезной, определенно более полезной и пригодной для повторного использования.

3 голосов
/ 20 ноября 2011

Чтение из ASCII-файла и двоичного файла не отличается, их разный анализ, после чтения ASCII-файла вы анализируете строку, чтобы удвоить, это получает время процесса. Но в двоичном файле ваш поток данных чтения полностью равен эквивалентному двоичному двойному числуи не надо разбирать.

0 голосов
/ 20 ноября 2011

Раз в месяц мы получаем CSV-файл размером 350 МБ с 3,5 миллионами строк, затем мы обычно читали его по одной строке за раз и составляли несколько индексов, это занимало приблизительно. 60 секунд каждый раз при перезапуске службы.
Я создал программу, которая выкинула ее до 1,7 миллиона строк и преобразовала в двоичный формат приблизительно в 24 МБ.
Эти данные были считаны непосредственно в память за 7 мс и при необходимости индексы генерировались, а при использовании данные конвертировались.
Потребление памяти сократилось с 400 МБ до 90 МБ.
Дело в том, что вам следует выбрать подходящий формат для ваших данных, если производительность является проблемой, Также обратите внимание, что это решение возможно только потому, что данные довольно статичны и что данные не извлекаются более нескольких миллионов раз за 24 часа.
Я считаю, что новый сервис на самом деле теперь реагирует немного быстрее, чем раньше .

...