Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > Парсер медленно работает


Автор: Rod 19.10.2006, 18:54
Есть файл - около 2 GB
Его обрабатывает парсер.
На обработку каждой строки уходит до 40ms(параметров в строке довольно много)
Как ускорить работу парсера хотя бы раза в 3?

Сейчас Используются следующие Функции :
fseek
fgetc
strstr
и др

Можно ли подгрузить кусок файла в память, а потом с ним работать?
Если да - то как?

Автор: MAKCim 19.10.2006, 21:19
Цитата

Можно ли подгрузить кусок файла в память, а потом с ним работать?
Если да - то как?

mmap/munmap тебе поможет
man 2 mmap

читай напрямую без библиотечных функций
через read и большими блоками
Цитата

fgetc

ужас

Автор: bsa 20.10.2006, 17:41
Rod
Для начала попробуй использовать fgets (fscanf). Думаю это значительно ускорит выполнение программы. Если же этого будет недостаточно, то остаются варианты работы через буфер или mmap, как советует MAKCim, но в этом случае реализция сложней.

Автор: bilbobagginz 21.10.2006, 02:22
иногда проблемы оптимизации встают в результате столкновения скорости кода программы с использованием оперативной памяти.
поэтому, у меня другой вопрос:
всякие любвеобильные к памяти програмки надо кормить соответствующим железом.

Сколько у вас, дорогой человек, памяти для этих игр с парсингом ?
как много памяти ипользует ваш код ?

насколько вы знакомы с параллелизацией кода, с параллельным и распределённым программированием ?


Автор: sergejzr 21.10.2006, 13:16
Вот примерчик для прохождение по файлу буффером
Код

#include <stdio.h>
#include <io.h>
/*by http://vingrad.ru/@sergejzr*/
int main(int argc, char *argv[])
{
FILE * in;
int  n,f;
char buf [512];//Buffer. размер- по вкусу и в зависимости от RAM'a

in=fopen(argv[1],"rb");
f=fileno(in);

while ((n = read(f, buf, sizeof(buf))) > 0)
 {
      parse(buf); //Ну а тут уже кусок обрабатываешь
 }

 return 0;
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)