Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / парсинг текстового файла / 25 сообщений из 61, страница 1 из 3
09.10.2013, 19:49
    #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
09.10.2013, 20:04
    #38422068
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
парсинг текстового файла
володька трынькинкак добиться результата, приближенного к этому?
Читать большими буферами. 32к или больше.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
09.10.2013, 20:10
    #38422076
Mapped File
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
парсинг текстового файла
володька трынькиндля сравнения в коммерческой софтине чтение файла ВМЕСТЕ с парсингом занимает ок 5-7 сек
как добиться результата, приближенного к этому?

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

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

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


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


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

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

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

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

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

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

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

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

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

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

хар-ки машины: i3 2.2, 4GB, SSD 250 GB. VS2010
...
Рейтинг: 0 / 0
10.10.2013, 11:21
    #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
10.10.2013, 11:27
    #38422627
парсинг текстового файла
novexelf,

к сожалению, это очень много, потому что
во-первых, этот код даже БЕЗ парсинга строки,
во-вторых, реально будет работать на машине намного слабее моей -(1.2 GHz atom, 1GB ram)
и время возрастет в разы сразу!
...
Рейтинг: 0 / 0
10.10.2013, 11:32
    #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
10.10.2013, 11:49
    #38422675
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
парсинг текстового файла
володька трынькин,
Ты сначала парсинг напиши, а потом уже будешь его оптимизировать.

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

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

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

как уже сказали - реализуйте для начала парсинг, а уж потом оптимизируйте.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / парсинг текстового файла / 25 сообщений из 61, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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