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

А покажи сырой формат файла input_file.txt что в нем лежит - первые n-строк.
и какие правила его формирования?
если длина записей "плавает" у тебя buf3 не будет работать корректно.
рекомендую кроме скорости чтения считать контрольную сумму данных из фала - чтобы заранее словить и логические ошибки алгоритма.

также попробуй сделать buf4() с использованием boost::iostreams::mapped_file_source
у тебя файл 90 гиг - усложнит чуток и придется прыгать по сегментам,
но зато исключишь лишнюю копию данных в памяти - все упрется в диск и cpu.
...
Рейтинг: 0 / 0
как быстрее всего прочесть большой файл с числами, каждое с новой строки?
    #39117213
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня какое-то адское déjà vu.

Почему мы всё время рекомендуем новичкам использовать Memory Mapped Files даже
там где задача - ярко выраженно требует поточной обработки.

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

Тут нет тренда.
если автор ищет способ ускорить чтение файла - почему-бы не попробовать все способы?

Также вы ведь не знаете все условия задачи.
может для оптимального решения достаточно поправить несколько
строк в том софте, который сохраняет пары int-значений в виде текста в 100 гиговый файл
а потом заставляет другой процесс героически парсить это гавно.

ну и если не сложно приведите свой пример поточной обработки.
рассмотрим его плюсы и минусы.
...
Рейтинг: 0 / 0
как быстрее всего прочесть большой файл с числами, каждое с новой строки?
    #39117429
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PPAможет для оптимального решения достаточно поправить несколько
строк в том софте, который сохраняет пары int-значений в виде текста в 100 гиговый файл
а потом заставляет другой процесс героически парсить это гавно.
memory mapped file на 100 гигов - здесь явно не при делах
...
Рейтинг: 0 / 0
как быстрее всего прочесть большой файл с числами, каждое с новой строки?
    #39117455
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PPAесли автор ищет способ ускорить чтение файла - почему-бы не попробовать все способы?
Судя по замерам не ту проблему он решает
log_here7.8 МБ / 1.3 c = 6 МБ/c и
7.8 МБ / 2.6 c = 3 МБ/c
это медленно даже если файл тянуть по 100 Мбитной сетке.
Как-то тестил: чтение блоками по 64Кб оптимально, дальнейшее увеличение блока ускорения не дает. Мап тоже тестил, получилось одинаково по скорости.

Проблема тут не в скорости чтения файла, а в скорости разбора. Тут парсер надо делать быстрый.

Допустим скорость чтения 50 Мб/с (неоптимальное чтение среднего HDD), тогда получается что 10% времени чтение - 90% обработка. Ускорим мы чтение до 500 Мб/с: 1% чтение - 90% обработка. И толку от этих 9% ускорения?
...
Рейтинг: 0 / 0
как быстрее всего прочесть большой файл с числами, каждое с новой строки?
    #39117465
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PPAТакже вы ведь не знаете все условия задачи.
может для оптимального решения достаточно поправить несколько
строк в том софте, который сохраняет пары int-значений в виде текста в 100 гиговый файл
а потом заставляет другой процесс героически парсить это гавно.
Я согласен. Давайте заслушаем ВСЕ условия задачи. Кстати я-бы не начал
перформить до тех пор пока не узнал бы целевую ОС. Судя по путям
у афтора Linux - но хотелось-бы услышать подтверждение.
...
Рейтинг: 0 / 0
как быстрее всего прочесть большой файл с числами, каждое с новой строки?
    #39117594
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonУ меня какое-то адское déjà vu.

Почему мы всё время рекомендуем новичкам использовать Memory Mapped Files даже
там где задача - ярко выраженно требует поточной обработки.

Коллеги. Поясните. Что за тренд такой?

Да вот я тоже не знаю, тем более что Memory Mapped Files ничего не ускоряют...
...
Рейтинг: 0 / 0
как быстрее всего прочесть большой файл с числами, каждое с новой строки?
    #39117662
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivДа вот я тоже не знаю, тем более что Memory Mapped Files ничего не ускоряют...
они ж для разделения данных между процессами, а не для ускорения.
...
Рейтинг: 0 / 0
как быстрее всего прочесть большой файл с числами, каждое с новой строки?
    #39117681
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилMasterZivДа вот я тоже не знаю, тем более что Memory Mapped Files ничего не ускоряют...
они ж для разделения данных между процессами, а не для ускорения.
Коллеги! Ну блин куда мы заехали? При чём тут разделение? Сабж не о том.
...
Рейтинг: 0 / 0
как быстрее всего прочесть большой файл с числами, каждое с новой строки?
    #39117682
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

сколько мегабайт в секунду является нормальным на твой взгляд?
...
Рейтинг: 0 / 0
как быстрее всего прочесть большой файл с числами, каждое с новой строки?
    #39117685
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скорость линейного чтения с диска.
...
Рейтинг: 0 / 0
как быстрее всего прочесть большой файл с числами, каждое с новой строки?
    #39117690
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Опять двадцать пять. Вы о чём? Хотите что-бы я назвал скорость
современного дискового интерфейса типа Sata-3 ? Я ее не помню
дословно.

Что такое нормально? Чтоб юзер был доволен текущим приложением.
Вот это и есть критерий нормально.
...
Рейтинг: 0 / 0
как быстрее всего прочесть большой файл с числами, каждое с новой строки?
    #39117693
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пользователь никогда (или почти никогда) не бывает доволен быстродействием программы.
А "скорость линейного чтения с диска" - нормальный и объективный критерий.
...
Рейтинг: 0 / 0
как быстрее всего прочесть большой файл с числами, каждое с новой строки?
    #39117698
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovА "скорость линейного чтения с диска" - нормальный и объективный
критерий.
Лучше всё же не полагаться на линейность, а в качестве критерия использовать скорость
копирования этого же файла в /dev/nul.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
как быстрее всего прочесть большой файл с числами, каждое с новой строки?
    #39117699
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилmayton,

сколько мегабайт в секунду является нормальным на твой взгляд?
~100 мб/с в среднем нормально. Замерить точнее просто: в фаре запускаешь копирование, в качестве места назначения пишешь nul. Будет показывать скорость чтения конкретного файла.
...
Рейтинг: 0 / 0
как быстрее всего прочесть большой файл с числами, каждое с новой строки?
    #39117711
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TБудет показывать скорость чтения конкретного файла.
из кэша.....
...
Рейтинг: 0 / 0
как быстрее всего прочесть большой файл с числами, каждое с новой строки?
    #39117750
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Давайте вернёмся к нашей задаче. У нас 100 млрд целых чисел в текстовом файле
и автору нужно это всё загрузить в коллекцию STD.

Вот как-то в таком вот аспекте.
...
Рейтинг: 0 / 0
как быстрее всего прочесть большой файл с числами, каждое с новой строки?
    #39117754
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonВот как-то в таком вот аспекте.
память прикупил топикстартер?
...
Рейтинг: 0 / 0
как быстрее всего прочесть большой файл с числами, каждое с новой строки?
    #39117766
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилDima TБудет показывать скорость чтения конкретного файла.
из кэша.....
Это со второго раза и то в случае если кэш больше файла. Если не путаю речь о 90 Гб, тут рядовой комп точно не закэширует.
...
Рейтинг: 0 / 0
как быстрее всего прочесть большой файл с числами, каждое с новой строки?
    #39117814
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На самом деле - афтор чёртов партизан и не говорит что он дальше будет делать с числами
а это мега важно для оптимизации. Далее. Линух или Виндовс. Хер ево знает но пускай
будет линух.

Вот шаблон который я скачал в стековервлоу http://stackoverflow.com/questions/28197649/reading-binary-file-in-c-in-chunks

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
size_t bytesRead = 0;
file = fopen(myfile, "rb");   

if (file != NULL)    
{
  // read up to sizeof(buffer) bytes
  while ((bytesRead = fread(buffer, 1, sizeof(buffer), file)) > 0)
  {
    // process bytesRead worth of data in buffer
  }
}



Его можно взять за основу. Есть блочное чтение и достаточно низкий уровень API.
Можно еще поискать open/read/close.

Далее. Работаем с байтами. Если автору нужны символы - то конвертит.

Синхронная работа.
Код: plaintext
1.
2.
3.
// process bytesRead worth of data in buffer

buffer....



Собственно здесь должен быть некий finite-state-machine который
разбирает поток символов на целые числа.

Код: plaintext
1.
2.
3.
4.
5.
while(...){
   // process byte (char)
   // convert into integer
   // process integer stream
}



Поскольку работаем синхронно - то чуть блокируем I/O.

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

Вот вобщем-то такое моё предложение.

Буду рад улучшениям и пожеланиям.

Не возражаю против магии Хогвартса mmaped-files но прошу аргументации.

Если лучше - то почему. Что достигаем? Что теряем? Напомню что в смежном
топике мы при тестинге на запись не учитывали отложенный flush и получали
неверную картину фиксации записи.

Напомню также что афтор упорно пытается прогрузить 100 млрд в коллекцию.
Возможно мы отговорим его от такого странного хода но в любом случае
memory надо использовать по хозяйски и не вносить в уравнение "свободная
память" нечто что не укладывается в прогноз по minimal requrements.

Напомню также что решение любой задачи не должно быть краш-тестом
для других приложений которые тихо зависнут или умрут по I/O timeout.
Нужно помнить о кооперативном разделении всех ресурсов.
...
Рейтинг: 0 / 0
как быстрее всего прочесть большой файл с числами, каждое с новой строки?
    #39117876
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonНапомню также что афтор упорно пытается прогрузить 100 млрд в коллекцию.
с этого начинать нужно
...
Рейтинг: 0 / 0
как быстрее всего прочесть большой файл с числами, каждое с новой строки?
    #39117939
log_here
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

ОС - Linux.
Предположим для простоты, что собираюсь сортировать (внешняя сотрировка).
...
Рейтинг: 0 / 0
как быстрее всего прочесть большой файл с числами, каждое с новой строки?
    #39117958
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
log_hereПредположим для простотыдавай реальную задачу,
алгоритмы внешней сортировки в любом учебнике описаны
...
Рейтинг: 0 / 0
как быстрее всего прочесть большой файл с числами, каждое с новой строки?
    #39117968
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Создание тестового файла
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
void create_file(const char* filename) {
	FILE* file = fopen(filename, "wb");   
	if (file != NULL) { 
		for(int i = 0; i < 1000000000; i++) {
			fprintf(file, "%d\n", rand());
		}
		fclose(file);
	}
}


у меня получилось 5398 Мб.
Меряем фаром скорость чтения (копирование в nul) - 620 Мб/с
Время 8,7 сек. это минимально возможное время.
Цикл только чтение
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
void read_speed(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 * 64];
		size_t bytesRead = 0;
		while ((bytesRead = fread(buffer, 1, sizeof(buffer), file)) > 0) {
			count++;
		}
		fclose(file);
	}
	printf("Count %d blocks Time %f sec.\n", count, (double)(clock() - start) / CLOCKS_PER_SEC);
}


Время 9,1 сек. т.е. всего на 5% больше минимума.

Замер на С++ (std::ifstream)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
void ifstream_speed(const char* filename)
{
	clock_t start = clock();
	std::ifstream ifs(filename, std::ios::binary);
	char buff[1024 * 64];
	int count = 0;

	while(ifs){
		ifs.read(buff, sizeof(buff));
		count++;
	}
	ifs.close();
	printf("Count %d blocks Time %f sec.\n", count, (double)(clock() - start) / CLOCKS_PER_SEC);
}


Время 9,5 сек. Чуть хуже, но не критично. 9% больше минимума.

Добавляем примитивный парсер: все что не числа - то разделители
Код: 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.
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 * 64];
		size_t bytesRead = 0;
		while ((bytesRead = fread(buffer, 1, sizeof(buffer), file)) > 0) {
			for(size_t i = 0; i < bytesRead; i++) {
				// считаем что все числа целые и разделены любыми разделителями
				if(buffer[i] >= '0' && buffer[i] <= '9') {
					n = n * 10 + buffer[i] - '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);
}


Время 16,7 сек. т.е. уже почти половина времени пошла на разбор. А тут еще никакого сохранения нет.

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


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