powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / как быстрее всего прочесть большой файл с числами, каждое с новой строки?
25 сообщений из 101, страница 3 из 5
как быстрее всего прочесть большой файл с числами, каждое с новой строки?
    #39117974
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

отрицательные числа - не обрабатываешь, за переполнением - не следишь
...
Рейтинг: 0 / 0
как быстрее всего прочесть большой файл с числами, каждое с новой строки?
    #39117975
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С указателями чуть быстрее
Код: 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.
void read_ints(const char* filename) {
	int count = 0;
	clock_t start = clock();
	FILE* file = fopen(filename, "rb");   
	if (file != NULL) { 
		int n = 0;
		bool store = false;
		char buffer[1024 * 8];
		size_t bytesRead = 0;
		while ((bytesRead = fread(buffer, 1, sizeof(buffer), file)) > 0) {
			char* end = buffer + bytesRead;
			for(char* cur = buffer; cur < end; cur++) {
				// считаем что все числа целые и разделены любыми разделителями
				if(*cur >= '0' && *cur <= '9') {
					n = n * 10 + *cur - '0';
					store = true;
				} else if(store) {
					// тут сохраняем результат
					//printf("%d\n", n);
					count++;
					store = false;
					n = 0;
				}
			}
		}
		fclose(file);
	}
	printf("Read %d numbers Time %f sec.\n", count, (double)(clock() - start) / CLOCKS_PER_SEC);
}


Померил еще зависимость времени от размера буфера
РазмерВремя4 Кб 15.18 Кб 14.816 Кб 14.932 Кб 14.864 Кб 15.5128 Кб 15.6256 Кб 15.8512 Кб 16.0
ХЗ почему так. Может из-за кэша проца.
...
Рейтинг: 0 / 0
как быстрее всего прочесть большой файл с числами, каждое с новой строки?
    #39117977
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилDima T,

отрицательные числа - не обрабатываешь, за переполнением - не следишь
Я же написал что парсер минимальный. Просто для демонстрации его влияния на общее время работы.
ХЗ какие правила разбора у ТС. Может там еще строки учитывать надо, т.е. в одной строке несколько чисел и т.д. и т.п.

Я к тому что чтение ускорять бесполезно - надо разбор ускорять.
...
Рейтинг: 0 / 0
как быстрее всего прочесть большой файл с числами, каждое с новой строки?
    #39117980
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TЯ же написал что парсер минимальный. Просто для демонстрации его влияния на общее время работы.
усложнение серьёзно повлияет на время работы - демонстрация ни о чём
...
Рейтинг: 0 / 0
как быстрее всего прочесть большой файл с числами, каждое с новой строки?
    #39118006
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилусложнение серьёзно повлияет на время работы
Я разве обратное утверждаю? Мой примитивнейший парсер уже почти вдвое замедлил работу. Это несерьезное влияние?
Изопропилдемонстрация ни о чём
Скорость работы родных средств разбора ТС уже потестил, с их результатов топик и родился.

Я о том что ТСу надо парсер свой писать и затачивать его под свою задачу.
...
Рейтинг: 0 / 0
как быстрее всего прочесть большой файл с числами, каждое с новой строки?
    #39118021
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добавил отрицательные и контроль переполнения
Код: 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.
42.
43.
44.
45.
void read_ints2(const char* filename) {
	int count = 0;
	clock_t start = clock();
	FILE* file = fopen(filename, "rb");   
	if (file != NULL) { 
		int n = 0;
		bool minus = false;
		bool store = false;
		bool overflow = false;
		char buffer[1024 * 8];
		size_t bytesRead = 0;
		while ((bytesRead = fread(buffer, 1, sizeof(buffer), file)) > 0) {
			char* end = buffer + bytesRead;
			for(char* cur = buffer; cur < end; cur++) {
				// считаем что все числа целые и разделены любыми разделителями
				if(*cur >= '0' && *cur <= '9') {
					int k = n * 10 + *cur - '0';
					if(!overflow) overflow = k < n;
					n = k;
					store = true;
				} else {
					if(store) {
						// тут сохраняем результат
						if(overflow) {
							printf("overflow\n");// переполнение
							overflow = false;
						} else {
							if(minus) {
								n = -n;
								minus = false;
							}
							//printf("%d\n", n);
							count++;
						}
						store = false;
						n = 0;
					}
					minus = (*cur == '-');
				}
			}
		}
		fclose(file);
	}
	printf("Read %d numbers Time %f sec.\n", count, (double)(clock() - start) / CLOCKS_PER_SEC);
}


Время 18.7 сек
Не особо замедлилось. Всего на 25%
...
Рейтинг: 0 / 0
как быстрее всего прочесть большой файл с числами, каждое с новой строки?
    #39118026
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задачка с собеседования?
...
Рейтинг: 0 / 0
как быстрее всего прочесть большой файл с числами, каждое с новой строки?
    #39118052
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

грязненько парсер выглядит
...
Рейтинг: 0 / 0
как быстрее всего прочесть большой файл с числами, каждое с новой строки?
    #39118069
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилDima T,

грязненько парсер выглядит
Напиши чистенько если время есть. Накидал по-быстрому первое что в голову пришло. Работает вроде правильно, но особо не тестил.
Что именно не понравилось?
...
Рейтинг: 0 / 0
как быстрее всего прочесть большой файл с числами, каждое с новой строки?
    #39118133
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TИзопропилDima T,

грязненько парсер выглядит
Напиши чистенько если время есть. Накидал по-быстрому первое что в голову пришло. Работает вроде правильно, но особо не тестил.
Что именно не понравилось?
Дима!

9 секунд чистого чтения против 15 секунд чтения + парсера?

Верно я понял твои цифры?
...
Рейтинг: 0 / 0
как быстрее всего прочесть большой файл с числами, каждое с новой строки?
    #39118138
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton, ты все правильно понял.
...
Рейтинг: 0 / 0
как быстрее всего прочесть большой файл с числами, каждое с новой строки?
    #39118143
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тогда курим двух-процессный режим. Возможно там будут нюансы.
Но неплохо было-бы сделать 1 процесс-поставщик который поставляет готовые
chunks (чётный - нечётный), а второй за ним подбирает и парсит. Это для модели
когда скорость чтения с диска достаточно равномерна.

Если будут сильные рывки - тогда имеет смысл сделать буферы побольше двух.
И завернуть их в бублик.
...
Рейтинг: 0 / 0
как быстрее всего прочесть большой файл с числами, каждое с новой строки?
    #39118193
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonНо неплохо было-бы сделать 1 процесс-поставщик который поставляет готовые
chunks (чётный - нечётный), а второй за ним подбирает и парсит
так следует действовать и с единственным процессом - получили буфер(синхронно/асинхронно, прочитали из хэндла/получили из фильтра и т д) - передали буфер парсеру.
...
Рейтинг: 0 / 0
как быстрее всего прочесть большой файл с числами, каждое с новой строки?
    #39118199
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил, согласен.
...
Рейтинг: 0 / 0
как быстрее всего прочесть большой файл с числами, каждое с новой строки?
    #39118325
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Асинхронное всё API здесь? Или еще где-то?
Код: plaintext
1.
#include <aio.h>
...
Рейтинг: 0 / 0
как быстрее всего прочесть большой файл с числами, каждое с новой строки?
    #39118679
YesSql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonАсинхронное всё API здесь? Или еще где-то?
Код: plaintext
1.
#include <aio.h>


Если мы говорим о линуксе то это user-space эмуляция POSIX AIO

linux aio сдесь
Код: plaintext
1.
#include <linux/aio_abi.h>
...
Рейтинг: 0 / 0
как быстрее всего прочесть большой файл с числами, каждое с новой строки?
    #39118681
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну тогда всё чики-пики. Только я щас метаюсь между форумом и багофиксом поставки.

Может кто-то "запилит" AIO-реализацию?
...
Рейтинг: 0 / 0
как быстрее всего прочесть большой файл с числами, каждое с новой строки?
    #39118694
YesSql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonНу тогда всё чики-пики. Только я щас метаюсь между форумом и багофиксом поставки.

Может кто-то "запилит" AIO-реализацию?
Нет никакого смысла использовать POSIX AIO эмуляцию. Делайте "true unix way" один процесс читает и выдает в stdout а другой берет из stdin и парсирует. Просто в реализации и оптимально. Можно и еще упростить - вместо первого процесса и bash сойдет. ;)
...
Рейтинг: 0 / 0
как быстрее всего прочесть большой файл с числами, каждое с новой строки?
    #39118701
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YesSql, некислую часть задач новичков в С++ можно свести к bash, grep, awk ...
...
Рейтинг: 0 / 0
как быстрее всего прочесть большой файл с числами, каждое с новой строки?
    #39118703
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonМожет кто-то "запилит" AIO-реализацию?
про AIO не в курсе. Хотел по-быстрому переделать под два потока на WinAPI: один читает, второй парсит. Переписал, но криво работает, 3 часа уже ошибку ищу. Вроде элементарная задача. Подозревать WinAPI в кривости последнее дело, явно сам где-то накосячил, не найду - выложу на общее обсуждение.
...
Рейтинг: 0 / 0
как быстрее всего прочесть большой файл с числами, каждое с новой строки?
    #39118707
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TmaytonМожет кто-то "запилит" AIO-реализацию?
про AIO не в курсе. Хотел по-быстрому переделать под два потока на WinAPI: один читает, второй парсит. Переписал, но криво работает, 3 часа уже ошибку ищу. Вроде элементарная задача. Подозревать WinAPI в кривости последнее дело, явно сам где-то накосячил, не найду - выложу на общее обсуждение.
Давай в sourceforge. Я тоже покурю. Только вечером.

Заодно сравним мультипоточность Win и мультипроцессность в Пингвине.
...
Рейтинг: 0 / 0
как быстрее всего прочесть большой файл с числами, каждое с новой строки?
    #39118721
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TХотел по-быстрому переделать под два потока на WinAPI
на WinAPI лучше будет completion port и один поток
...
Рейтинг: 0 / 0
как быстрее всего прочесть большой файл с числами, каждое с новой строки?
    #39118722
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Начитался про lock-free алгоритмы, хотел на практике затестить, задача подходящая, но похоже что-то я недопонял. Подождем до завтра. Утром обычно все понятнее становится. Не взлетит - выложу на общее о(б)суждение :) Взлетит - тоже выложу.
...
Рейтинг: 0 / 0
как быстрее всего прочесть большой файл с числами, каждое с новой строки?
    #39118732
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилна WinAPI лучше будет completion port и один поток
Нет цели сделать на/под WinAPI, т.е. только под Win. Есть обратная цель - сделать универсально. Но де-факто есть VC2008 на XP. Там нет С++11 с трэдами и <atomic>. От XP отказаться пока не готов: VC2012 где есть С++11 - не ставится. Надо наверно уже переехать на W7, но жаба давит: там где живет 5 виртуалок на XP - еле влазит одна W7. SSD не резиновые.
...
Рейтинг: 0 / 0
как быстрее всего прочесть большой файл с числами, каждое с новой строки?
    #39118754
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А мне вот это интересно попробовать

https://www.freebsd.org/ru/features.html Многопоточая модель M:N через pthreads делает возможным масштабируемое исполнение потоков на множестве CPU, ставя множество пользовательских потоков в соответствие малому количеству Kernel Schedulable Entities. С принятием модели Scheduler Activation такой подход к многопоточности может быть адаптирован к специфическим требованиям широкого набора приложений.
...
Рейтинг: 0 / 0
25 сообщений из 101, страница 3 из 5
Форумы / C++ [игнор отключен] [закрыт для гостей] / как быстрее всего прочесть большой файл с числами, каждое с новой строки?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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