powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / парсинг текстового файла
61 сообщений из 61, показаны все 3 страниц
парсинг текстового файла
    #38422049
добрый вечер, коллеги

стоит задача распарсить большой файл (размер ок 100 МБ). экспериментирую с С++
сейчас такая задача (просто посимвольное чтение, БЕЗ парсинга) занимает ок 80 сек.
вот код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
std::ifstream infile;

std::string line;

	int j = 0, m = 0;

	infile.open(filename);

	if (infile == NULL) return 1;

while (!infile.eof())
{
	getline(infile, line);

	for (int it = 0; it < line.length(); it++)
	{
		m++;
	}
	j++;
}

infile.close();



для сравнения в коммерческой софтине чтение файла ВМЕСТЕ с парсингом занимает ок 5-7 сек
как добиться результата, приближенного к этому?
был вариант использовать загрузку файла в озу, но думаю в скорости прироста не будет потому что на компе ssd-диск. (по крайней мере реализация этими двумя способами: через озу и без - на питоне эффекта не дало)
...
Рейтинг: 0 / 0
парсинг текстового файла
    #38422068
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
володька трынькинкак добиться результата, приближенного к этому?
Читать большими буферами. 32к или больше.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
парсинг текстового файла
    #38422076
Mapped File
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
володька трынькиндля сравнения в коммерческой софтине чтение файла ВМЕСТЕ с парсингом занимает ок 5-7 сек
как добиться результата, приближенного к этому?

смаппировать файл на память и распарсить.
...
Рейтинг: 0 / 0
парсинг текстового файла
    #38422089
Dimitry Sibiryakov,
а можно поподробнее?
прошу понять - я новичок в с++
...
Рейтинг: 0 / 0
парсинг текстового файла
    #38422090
Mapped File,

имеете ввиду через mmap ?
...
Рейтинг: 0 / 0
парсинг текстового файла
    #38422094
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
володька трынькин,

Я тебе скажу по секрету, что чтение файла и парсинг и просто чтение файла занимают почти одно и то же время.
Потому как чтение -- это милисекунды, а парсинг -- наносекунды.
...
Рейтинг: 0 / 0
парсинг текстового файла
    #38422095
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
володька трынькиня новичок в с++
Ну так программируй по-старинке, как в С: fopen, fread, fclose.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
парсинг текстового файла
    #38422097
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakovволодька трынькинкак добиться результата, приближенного к этому?
Читать большими буферами. 32к или больше.


Да ерунда, я писал парсинг подобных же файлов таких размеров, на том же ifstream.
Не нужно никаких больших буферов. Они и так есть. Может не большие, но достаточные вполне.
...
Рейтинг: 0 / 0
парсинг текстового файла
    #38422098
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakovволодька трынькиня новичок в с++
Ну так программируй по-старинке, как в С: fopen, fread, fclose.


А смысл ? Думаешь, оно из файла будет быстрее таким образом читать ?
...
Рейтинг: 0 / 0
парсинг текстового файла
    #38422102
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, от getline по любому надо избавиться.
...
Рейтинг: 0 / 0
парсинг текстового файла
    #38422209
пока никто ничего дельного не посоветовал.
может быть стоит читать файл кусками например строк по 1000. и каждую в отдельном потоке обрабатывать?
...
Рейтинг: 0 / 0
парсинг текстового файла
    #38422210
MasterZivволодька трынькин,

Я тебе скажу по секрету, что чтение файла и парсинг и просто чтение файла занимают почти одно и то же время.
Потому как чтение -- это милисекунды, а парсинг -- наносекунды.

почему в итоге время такое большое получается?
...
Рейтинг: 0 / 0
парсинг текстового файла
    #38422223
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
володька трынькинпока никто ничего дельного не посоветовал.
может быть стоит читать файл кусками например строк по 1000.
неправда - тебе посоветовали не читать строками
...
Рейтинг: 0 / 0
парсинг текстового файла
    #38422239
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
володька трынькин,

А вы случайно не в Дебаг режиме собираете программу?
Если да - переключите в Релиз.
Как - не знаю, т.к. вы не указали какой компилятор и среду разработки используете.
...
Рейтинг: 0 / 0
парсинг текстового файла
    #38422245
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я кстати только что взял ваш код (один в один) и с помощью него прочел 120 МБ видео файл.
Замерял на глаз - 1 сек при первом (некешированном) чтении с диска
и мгновенно при последующих (кешированных) чтениях.

В дебаг сборке тоже меньше секунды занимает чтение.

Так что откуда ваши 80 секунд взялись - не понятно.
Давайте нам сюда детали - что за оборудование, ОС, компилятор, опции сборки.
...
Рейтинг: 0 / 0
парсинг текстового файла
    #38422248
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня возникло предположение что в вашем файле нет или очень мало концов строк, что означает что внутри getline очень большой объем данных постепенно записывается в строковую переменную, и происходят постоянные переаллокации памяти в этой переменной, что дает экспоненциальный рост времени выполнения от размера файла.
Какие у вас j и m в конце работы программы?

Если ваш файл не текстовый, а бинарный, то построчно его парсить нельзя.
...
Рейтинг: 0 / 0
парсинг текстового файла
    #38422252
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyНу, от getline по любому надо избавиться.

Почему?
...
Рейтинг: 0 / 0
парсинг текстового файла
    #38422256
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivAnatoly MoskovskyНу, от getline по любому надо избавиться.

Почему?
См. мое предыдущее сообщение.
...
Рейтинг: 0 / 0
парсинг текстового файла
    #38422566
Anatoly Moskovsky,

вроде со строками нормально все.
получились m = 104 145 658, j = 5 296 259 - те же самые числа, что показывает текстовый редактор. за исключением, что в редакторе число символов почти на 10 млн больше - видимо, потому что он считает служебные символы (переход на новую строку и тд)
файл именно текстовый, не бинарный!

хар-ки машины: i3 2.2, 4GB, SSD 250 GB. VS2010
...
Рейтинг: 0 / 0
парсинг текстового файла
    #38422614
novexelf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
володька трынькиндобрый вечер, коллеги

стоит задача распарсить большой файл (размер ок 100 МБ). экспериментирую с С++
сейчас такая задача (просто посимвольное чтение, БЕЗ парсинга) занимает ок 80 сек.
вот код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
std::ifstream infile;

std::string line;

	int j = 0, m = 0;

	infile.open(filename);

	if (infile == NULL) return 1;

while (!infile.eof())
{
	getline(infile, line);

	for (int it = 0; it < line.length(); it++)
	{
		m++;
	}
	j++;
}

infile.close();



для сравнения в коммерческой софтине чтение файла ВМЕСТЕ с парсингом занимает ок 5-7 сек
как добиться результата, приближенного к этому?
был вариант использовать загрузку файла в озу, но думаю в скорости прироста не будет потому что на компе ssd-диск. (по крайней мере реализация этими двумя способами: через озу и без - на питоне эффекта не дало)

а в чем проблема-то? 80 секунд разве не ерунда?
...
Рейтинг: 0 / 0
парсинг текстового файла
    #38422627
novexelf,

к сожалению, это очень много, потому что
во-первых, этот код даже БЕЗ парсинга строки,
во-вторых, реально будет работать на машине намного слабее моей -(1.2 GHz atom, 1GB ram)
и время возрастет в разы сразу!
...
Рейтинг: 0 / 0
парсинг текстового файла
    #38422637
в общем переписал код. теперь весь файл грузится в память

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
FILE * pFile;
	long lSize;
	char * buffer;
	size_t result;

	pFile = fopen ( filename , "rb" );
	if (pFile==NULL) 
	{
		fputs ("File error",stderr); 
		exit (1);
	}

	// obtain file size:
	fseek (pFile , 0 , SEEK_END);
	lSize = ftell (pFile);
	//rewind (pFile);

	// allocate memory to contain the whole file:
	buffer = (char*) malloc (sizeof(char)*lSize);

	if (buffer == NULL) 
	{
		fputs ("Memory error",stderr); 
		exit (2);
	}

	fseek(pFile, 0, SEEK_SET);

	if (lSize != fread(buffer, 1, lSize, pFile))
	{
		free(buffer);
		fclose(pFile);
		fputs("different size", stderr);
		return -1;
	}

	// terminate
	fclose (pFile);


	free (buffer);



может это будет работать быстрее.
но у меня вопрос: как из буфера типа char* читать посимвольно?
...
Рейтинг: 0 / 0
парсинг текстового файла
    #38422675
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
володька трынькин,
Ты сначала парсинг напиши, а потом уже будешь его оптимизировать.

Ещё раз, если не напороть, то скорость парсинга будет просто скоростью чтения.
Поэтому если тебе не нужно в процессе обработки прыгать в начало и конец файла попеременно, то читать файл в память нет смысла.
...
Рейтинг: 0 / 0
парсинг текстового файла
    #38422678
m_Sla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
выводим первые 100 символов на экран
Код: plaintext
1.
2.
3.
4.
for(int i=0;i<100;i++)
{
     cout<<buffer[i];
}
...
Рейтинг: 0 / 0
парсинг текстового файла
    #38422693
novexelf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
володька трынькинnovexelf,

к сожалению, это очень много, потому что
во-первых, этот код даже БЕЗ парсинга строки,
во-вторых, реально будет работать на машине намного слабее моей -(1.2 GHz atom, 1GB ram)
и время возрастет в разы сразу!

говорить о том много это или нет, можно только если ввести вторую величину, с которой сравнивать.
почему 80 секунд это много?
я так понимаю, что весь вопрос в том, что другое приложение делает это быстрее.
т.е. вы сами себе поставили ограничение - реализовать со скоростью, сопоставимой с ...
даже если парсинг увеличит время обработки до 3-5 минут, в чем тут проблема?
вы же не раскрываете тайный смыл, например, если нужно будет один раз в день обрабатывать файл вашим приложением, то особой проблемы в том будет ли это выполнятся 5-7 секунд или 5-7 минут нет, просто сотрудник нальет себе чашку бодрящего ...
другое дело, если технологический процесс выдает файлы 1 раз в минуту и их нужно успевать обрабатывать, явно будет очередь, которая будет постоянно расти.

как уже сказали - реализуйте для начала парсинг, а уж потом оптимизируйте.
...
Рейтинг: 0 / 0
парсинг текстового файла
    #38422741
всем спасибо за помощь!
сейчас мой последний вариант работает менее 1 сек.
по крайней мере посимвольное чтение
Код: plaintext
1.
2.
3.
4.
5.
6.
	
for(int i=0;i < lSize;i++)
	{
		 ch = buffer[i];
		 j++;
	}



вообще моментально происходит.

еще задам пару глупых вопросов:
1) почему переменная типа char* автоматически считается массивом (т.е. обращаться можно поэлементно []) ?
2) почему сразу после объявления char ch она инициализируется символом M. вернее она не инициализирована, однако Watch показыает 'M'
по п.1 ткните где почитать доступно
...
Рейтинг: 0 / 0
парсинг текстового файла
    #38422748
novexelfволодька трынькинnovexelf,

к сожалению, это очень много, потому что
во-первых, этот код даже БЕЗ парсинга строки,
во-вторых, реально будет работать на машине намного слабее моей -(1.2 GHz atom, 1GB ram)
и время возрастет в разы сразу!

говорить о том много это или нет, можно только если ввести вторую величину, с которой сравнивать.
почему 80 секунд это много?
я так понимаю, что весь вопрос в том, что другое приложение делает это быстрее.
т.е. вы сами себе поставили ограничение - реализовать со скоростью, сопоставимой с ...
даже если парсинг увеличит время обработки до 3-5 минут, в чем тут проблема?
вы же не раскрываете тайный смыл, например, если нужно будет один раз в день обрабатывать файл вашим приложением, то особой проблемы в том будет ли это выполнятся 5-7 секунд или 5-7 минут нет, просто сотрудник нальет себе чашку бодрящего ...
другое дело, если технологический процесс выдает файлы 1 раз в минуту и их нужно успевать обрабатывать, явно будет очередь, которая будет постоянно расти.

как уже сказали - реализуйте для начала парсинг, а уж потом оптимизируйте.

по крайней мере теперь я буду реализовывать парсинг и уже именно его оптимизировать, добиваясь 7 секунд))
...
Рейтинг: 0 / 0
парсинг текстового файла
    #38422806
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
володька трынькинnovexelf,

к сожалению, это очень много, потому что
во-первых, этот код даже БЕЗ парсинга строки,
во-вторых, реально будет работать на машине намного слабее моей -(1.2 GHz atom, 1GB ram)
и время возрастет в разы сразу!

чего ты вообще сунулся на эту задачу?
Не понимаешь же ничерта... Не знаешь ничего...


Сначала учиться надо, потом работать.
...
Рейтинг: 0 / 0
парсинг текстового файла
    #38422815
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivСначала учиться надо, потом работать.
Ну дык топикстартер и учится на реальной задаче
...
Рейтинг: 0 / 0
парсинг текстового файла
    #38422822
novexelf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
володька трынькинвсем спасибо за помощь!
сейчас мой последний вариант работает менее 1 сек.
по крайней мере посимвольное чтение
Код: plaintext
1.
2.
3.
4.
5.
6.
	
for(int i=0;i < lSize;i++)
	{
		 ch = buffer[i];
		 j++;
	}



вообще моментально происходит.

еще задам пару глупых вопросов:
1) почему переменная типа char* автоматически считается массивом (т.е. обращаться можно поэлементно []) ?
2) почему сразу после объявления char ch она инициализируется символом M. вернее она не инициализирована, однако Watch показыает 'M'
по п.1 ткните где почитать доступно

с такими знаниями С/С++ с парсингом наверное будет тяжко ...
...
Рейтинг: 0 / 0
парсинг текстового файла
    #38422829
novexelf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ИзопропилMasterZivСначала учиться надо, потом работать.
Ну дык топикстартер и учится на реальной задаче

ну да форум вот читает :-)
...
Рейтинг: 0 / 0
парсинг текстового файла
    #38422836
MasterZivволодька трынькинnovexelf,

к сожалению, это очень много, потому что
во-первых, этот код даже БЕЗ парсинга строки,
во-вторых, реально будет работать на машине намного слабее моей -(1.2 GHz atom, 1GB ram)
и время возрастет в разы сразу!

чего ты вообще сунулся на эту задачу?
Не понимаешь же ничерта... Не знаешь ничего...


Сначала учиться надо, потом работать.

мне кажется именно так и происходит процесс обучения, не?
вы учились исключительно читая книжки???

ок, ребят. предыстория такова
проект пишется на питоне. и на данный момент чтение как и парсинг файла я реализовал именно на нем (время обработки файла 100 МБ около 3 мин). потом посмотрев, что есть сторонний софт, который аналогичные действия выполняет за считанные секунды, решил приблизиться к этому времени.
теперь процедуру парсинга напишу на с++, засуну в DLL и подключу к питон-приложению (через ctypes)
как-то так
...
Рейтинг: 0 / 0
парсинг текстового файла
    #38422866
novexelf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
володька трынькинMasterZivпропущено...


чего ты вообще сунулся на эту задачу?
Не понимаешь же ничерта... Не знаешь ничего...


Сначала учиться надо, потом работать.

мне кажется именно так и происходит процесс обучения, не?
вы учились исключительно читая книжки???

ок, ребят. предыстория такова
проект пишется на питоне. и на данный момент чтение как и парсинг файла я реализовал именно на нем (время обработки файла 100 МБ около 3 мин). потом посмотрев, что есть сторонний софт, который аналогичные действия выполняет за считанные секунды, решил приблизиться к этому времени.
теперь процедуру парсинга напишу на с++, засуну в DLL и подключу к питон-приложению (через ctypes)
как-то так

ну если не знаешь азов языка, то обычно их учат, а после практикуются в их применении ...

обычно вся мощь языка заключена в его хорошем знании, которого в данном случае у вас нет, а поэтому может случится так, что исполнение на С/С++ будет еще медленнее, чем все остальные.

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

пока что вы пишите на Сях

:-)
...
Рейтинг: 0 / 0
парсинг текстового файла
    #38422888
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
володька трынькинMasterZivпропущено...


чего ты вообще сунулся на эту задачу?
Не понимаешь же ничерта... Не знаешь ничего...


Сначала учиться надо, потом работать.

мне кажется именно так и происходит процесс обучения, не?
вы учились исключительно читая книжки???

ок, ребят. предыстория такова
проект пишется на питоне. и на данный момент чтение как и парсинг файла я реализовал именно на нем (время обработки файла 100 МБ около 3 мин). потом посмотрев, что есть сторонний софт, который аналогичные действия выполняет за считанные секунды, решил приблизиться к этому времени.
теперь процедуру парсинга напишу на с++, засуну в DLL и подключу к питон-приложению (через ctypes)
как-то так
А почему ты не пошёл в форум по Питону и не попробовал соптимизировать то что было написано?
Почему ринулся сразу кодить на 2-х технологиях (учитывая риски того что ты еще и плохо знаешь
С++ и не учёл накладные расходы на переходник между двумя технологиями) а просто не проанализировал
где у тебя боттлнек?
...
Рейтинг: 0 / 0
парсинг текстового файла
    #38422889
ну если не знаешь азов языка, то обычно их учат, а после практикуются в их применении ...

у меня все параллельно идет и теория и практика))

ничего запутанного, есть сторонний софт который делает много чего полезного, работает только под виндой, и проект закрытый.
а нам нужно лишь пара функции из того что делает софтина (причем не совсем таких же, а очень похожих), причем работать должно как под виндой, так и под линуксом. ну все равно что мс офис и блокнот (либо gedit)
в общем, поверьте мне, смысл в этом есть и время тратить стоит :)
ЗЫ чувствую после слов о кроссплатформенности опять полетят "да куда он лезет!", "он же ничерта не знает!", а MasterZiv ?))
...
Рейтинг: 0 / 0
парсинг текстового файла
    #38422901
mayton,

я не ринулся сразу на 2 технологии. я к этому постепенно пришел.
сначала на питоне реализовал это 4-мя различными способами. и подумал, что быстрее уже на нем невозможно. все-таки интерпретатор...
шерстил в основном аглицкие форумы
а вот насчет передачи данных в питон - вы правы, скорее всего это и будет ботлнеком. посмотрим
...
Рейтинг: 0 / 0
парсинг текстового файла
    #38422910
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
володька трынькинmayton,

я не ринулся сразу на 2 технологии. я к этому постепенно пришел.
сначала на питоне реализовал это 4-мя различными способами. и подумал, что быстрее уже на нем невозможно. все-таки интерпретатор...
шерстил в основном аглицкие форумы
а вот насчет передачи данных в питон - вы правы, скорее всего это и будет ботлнеком. посмотрим
Можешь приаттачить в форум эти версии исходников?

(Я думаю коллеги модераторы будут не против если это будет сравнение С++ и Pytnon).
...
Рейтинг: 0 / 0
парсинг текстового файла
    #38422920
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не разбираюсь в Питоне но вот нашёл ссылку в которой приводят
советы по Performance:

https://wiki.python.org/moin/PythonSpeed/PerformanceTips

Вы пробовали имплеменить эти советы?
...
Рейтинг: 0 / 0
парсинг текстового файла
    #38422955
mayton,
да конечно
Код: python
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
1)
with open(filename) as fi:
	for line in fi:
		for sym in line:
			i += 1


		
2)
for l in tailer.head(open(filename), lines=100000):
	for sym in l:
		s = sym
		i+= 1
	
3)
with open(filename, "r+b") as f:
	mm = mmap.mmap(f.fileno(), 0)
	for line in iter(mm.readline, ""):
		for sym in line:
			s = sym
			i+= 1
	mm.close()
	
4)
for line in open(filename, 'r').readlines():
	for sym in line:
		s = sym

5)
with open(filename, "r+b") as f:
	while 1:
		lines = f.readlines(100000)
		if not lines: break
		for line in lines:
			for sym in line:
				s = sym
				i+= 1


может кому полезно будет
да, спасибо, этот документ читал.
...
Рейтинг: 0 / 0
парсинг текстового файла
    #38422961
а так же сейчас реализовал чисто через вызовы Си ф-ий
Код: python
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
from ctypes import * 
import ctypes.util

import time 

t1 = time.time()

libc = cdll.LoadLibrary(ctypes.util.find_library('c'))
fopen = libc.fopen
fread = libc.fread
fseek = libc.fseek
ftell = libc.ftell
fclose = libc.fclose
free = libc.free

fread.argtypes = [c_void_p, c_size_t, c_size_t, c_void_p]

fh = fopen(fllename, "rb")
fseek(fh, 0 , 2) # SEEK_END = 2
size = ftell(fh)
fseek(fh, 0 , 0) # SEEK_SET = 0


buf = create_string_buffer(size)
fread(buf, 1, size, fh)

i = 0
st = ''
for m in buf:
	i += 1
	
print i

print "time: " + str(time.time() - t1)

fclose(fh)
free(buf)
...
Рейтинг: 0 / 0
парсинг текстового файла
    #38423080
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
володька трынькинмне кажется именно так и происходит процесс обучения, не?


Неа.

володька трынькинвы учились исключительно читая книжки???


Да. Извини, но с такими вопросами типа "как из буфера типа char* читать посимвольно? "
ты далеко не напарсишь.

володька трынькинпроект пишется на питоне. и на данный момент чтение как и парсинг файла я реализовал именно на нем (время обработки файла 100 МБ около 3 мин). потом посмотрев, что есть сторонний софт, который аналогичные действия выполняет за считанные секунды, решил приблизиться к этому времени.
теперь процедуру парсинга напишу на с++, засуну в DLL и подключу к питон-приложению (через ctypes)


У тебя как у многих дурацкое заблуждение, что на С/С++ программы автоматом будут работать быстрее.
Это не так. В частности, чтение файла в буфер на питоне не только такое же по скорости, но и ровно то же самое
по реализации -- используется та же библиотека CRT.
...
Рейтинг: 0 / 0
парсинг текстового файла
    #38423158
MasterZiv,

да, у меня получилось чтение в буфер такое же, а вот итеративные операции по строкам и по символам намного медленнее
...
Рейтинг: 0 / 0
парсинг текстового файла
    #38423239
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
володька трынькин, а почему ты не попробовал

как пишут здесь
http://docs.python.org/2/tutorial/inputoutput.html
Код: python
1.
2.
3.
4.
5.
>>> for line in f:
        print line,

This is the first line of the file.
Second line of the file



или как здесь?
http://effbot.org/zone/readline-performance.htm
Код: python
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
# File: readline-example-3.py

file = open("sample.txt")

while 1:
    lines = file.readlines(100000)
    if not lines:
	break
    for line in lines:
	pass # do something



Пока не рассказывай про посимвольное чтение. Ведь ты символы в приведённых
фрагментах кода никак не использовал кроме как тупо вёл учёт количества букв.
А это можно сделать и через контейнер строки.
...
Рейтинг: 0 / 0
парсинг текстового файла
    #38423285
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
володька трынькинMasterZiv,

да, у меня получилось чтение в буфер такое же, а вот итеративные операции по строкам и по символам намного медленнее

Я уверен, что можно было бы найти решение и на питоне.
...
Рейтинг: 0 / 0
парсинг текстового файла
    #38423303
novexelf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
володька трынькинMasterZiv,

да, у меня получилось чтение в буфер такое же, а вот итеративные операции по строкам и по символам намного медленнее

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

в результате получается, что для успеха нужен большой багаж знаний и если его нет парсинг может превратится в ужас.

ЗюЫю в универе делали учебный компилятор, простой при простой, вот те кто делал на паскале имели меньше проблем, чем те которые делали на сях, за счет наличия строк, операторов конкатенации и прочих плюшек паскаля, у меня тогда знания были в зачатке и практики мало, поэтому я намучался, но это была учебная задача, там как раз и нужно было намучаться :-)
...
Рейтинг: 0 / 0
парсинг текстового файла
    #38423378
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
О каком парсинге тут идёт речь - еще не ясно? Может автору просто надо СSV-файл побить
на строки и поля в загрузить в БД. Здесь достаточно тривиально. Если грамматика чуть сложнее
то нужно вводить некий "автомат" который имеет в процессе парсинга своё "состояние" и в зависимости
от текущего символа принимает разные решения. Это тяжёлая артиллерия, и здесь на голых сях
и на питонах обычно не пишут а используют различные генераторы парсеров которых щас много
и с либеральными лицезиями.
...
Рейтинг: 0 / 0
парсинг текстового файла
    #38423386
mayton,

эти два варианта есть в моих примерах! символы я буду использовать уже в парсинге
...
Рейтинг: 0 / 0
парсинг текстового файла
    #38423389
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
володька трынькинсимволы я буду использовать уже в парсинге
Гораздо проще там использовать регэкспы.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
парсинг текстового файла
    #38423397
novexelf,

делаю нечто похожее, только не компилятор, а интерпретатор.
на первоначальном этапе нужно разбить файл на лексемы. для этого и читаю посимвольно
...
Рейтинг: 0 / 0
парсинг текстового файла
    #38423402
Dimitry Sibiryakovволодька трынькинсимволы я буду использовать уже в парсинге
Гораздо проще там использовать регэкспы.

да, возможно стоит попробовать на регулярках. здесть уже не надо будет читать посимвольно.
но дело в том что сам алгоритм разбора строки уже реализован на питоне. его нужно только перенести на си. проблем вроде быть не должно
...
Рейтинг: 0 / 0
парсинг текстового файла
    #38423404
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
володька трынькин, тут непонятно с чем мы воюем. Я конечно не спец в этих ваших
питонах но возможно там есть некий ключик который влияет на режим компилляции
рантайма.

И кстати. Ты мог-бы нарисовать и заполнить табличку? нечто вроде

Python sourceElapsed time(sec)1)2)3)4)5)copy file to NULL

В последнем варианте ты просто копируешь файл в устройство NUL или /dev/null.

copy file.txt NUL

или

$ cp file.txt /dev/null
...
Рейтинг: 0 / 0
парсинг текстового файла
    #38423405
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
володька трынькинделаю нечто похожее, только не компилятор, а интерпретатор.
на первоначальном этапе нужно разбить файл на лексемы. для этого и читаю посимвольно
А что за программы такие по 100 МБ?
...
Рейтинг: 0 / 0
парсинг текстового файла
    #38423410
novexelf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly Moskovskyволодька трынькинделаю нечто похожее, только не компилятор, а интерпретатор.
на первоначальном этапе нужно разбить файл на лексемы. для этого и читаю посимвольно
А что за программы такие по 100 МБ?

да-да, мне тоже интересно, что вы там интерпритируете, ядро линуха?
...
Рейтинг: 0 / 0
парсинг текстового файла
    #38423412
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут такие expectations... Если время копирования файла не отличается от времени
парсинга (несколько процентов разницы) то мы сделали что смогли и к питону
нет претензий. У тебя просто слабая дисковая подсистема или работает
параллельно явление или процесс который грузит систему другой нагрузкой.
Это конечно смешно но в форуме были любители погонять бенчмарки
которые параллельно смотрели кино в HD качестве или сканировали антивирусом
активный диск.

Если время сильно отличается то надо думать дальше.
...
Рейтинг: 0 / 0
парсинг текстового файла
    #38423711
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
володька трынькинна первоначальном этапе нужно разбить файл на лексемы
а дальше куда помещается результат работы лексического анализатора?
...
Рейтинг: 0 / 0
парсинг текстового файла
    #38424896
kT_________
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Коллеги, думаю можно наспамить ссылок про азы оптимизации, типо передавать всё по ссылкам и т.п.
Главное парсер 100% что за алгоритм там, обратите внимание на Спирит Буста, особенно если С++ Вам интересен в долгосрочной перспективе, т.к. ради одной такой задачи учить язык контрпродуктивно.

Если ошибки компиляции на несколько экранов Вас не пугают, пробуйте Спирит, документация норм, примеры, из минусов наверно долгая сборка, но смотря какие словари, не большие не долго собираются ;)
...
Рейтинг: 0 / 0
парсинг текстового файла
    #38424898
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мультритрединг мать его так. И zero-copy. Форсируем.
...
Рейтинг: 0 / 0
парсинг текстового файла
    #38424917
kT_________
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonМультритрединг мать его так. И zero-copy. Форсируем.

+Inline functions
...
Рейтинг: 0 / 0
парсинг текстового файла
    #38424922
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну эт само собой. Не знаю как этом Удаве Питоне с инлайнингом. Думаю что просаживает
он перформанс на работе со строками (декодирование кодовой страницы) и с уборкой мусора.
Да и вообще неизвестно как там строки реализованы. Мутабельны или нет. Unicode или нет.
...
Рейтинг: 0 / 0
парсинг текстового файла
    #38428273
irokosovskiy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Парсинг для строки. Думаю не составит труда считать файл в буфер и парсить его:


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
char * substr(const char *src, int from, int size) 
{
    char * c_TmpStr = new char[size + 1];
    int j = 0;
    for (int i = from; i < from + size; i++)
        c_TmpStr[j++] = src[i];
    c_TmpStr[size] = 0;
    return c_TmpStr;
}
...
Рейтинг: 0 / 0
парсинг текстового файла
    #38428279
irokosovskiy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
володька трынькин, вот кусок куда для работы с буфером.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
char * substr(const char *src, int from, int size) 
{
    char * c_TmpStr = new char[size + 1];
    int j = 0;
    for (int i = from; i < from + size; i++)
        c_TmpStr[j++] = src[i];
    c_TmpStr[size] = 0;
    return c_TmpStr;
}
...
Рейтинг: 0 / 0
61 сообщений из 61, показаны все 3 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / парсинг текстового файла
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]