powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / как быстрее всего прочесть большой файл с числами, каждое с новой строки?
25 сообщений из 101, страница 1 из 5
как быстрее всего прочесть большой файл с числами, каждое с новой строки?
    #39115487
log_here
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Допустим, есть файл, состоящий из 100 000 000 000 чисел int, каждое число записано с новой строчки.
Надо последовательно его прочесть. Мне кажется, будет намного быстрее, если читать не число за числом, а сразу много чисел читать и загружать в локальный массив (вектор), проводя загрузку несколько раз.

Как можно это сделать?
Если есть ещё более быстрый способ -- ещё лучше.

я знаю, что можно использовать [code cpp] std::fstream[code],
но есть ли более быстрый способ?
...
Рейтинг: 0 / 0
как быстрее всего прочесть большой файл с числами, каждое с новой строки?
    #39115490
log_here
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И ещё вопрос: почему файл с
Код: plaintext
1.
1024 * 1024 / sizeof(int)

числами занимает ощутимо больше, чем 1 МБ, даже если числа внутри файла ничем не разделены?
...
Рейтинг: 0 / 0
как быстрее всего прочесть большой файл с числами, каждое с новой строки?
    #39115553
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
log_hereДопустим, есть файл, состоящий из 100 000 000 000 чисел int, каждое число записано с новой строчки.
Надо последовательно его прочесть. Мне кажется, будет намного быстрее, если читать не число за числом, а сразу много чисел читать и загружать в локальный массив (вектор), проводя загрузку несколько раз.Правильно, читаешь блок байтиков и расшифровываешь их из буфера в массив.

log_hereя знаю, что можно использовать [code cpp] std::fstream[code],
но есть ли более быстрый способ?Самостоятельно написать аналог, но убрать из него все проверки на ошибки чтения и расшифровки, а потом молиться что ошибки не случаться.
...
Рейтинг: 0 / 0
как быстрее всего прочесть большой файл с числами, каждое с новой строки?
    #39115554
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
log_here...Как можно это сделать?...есть ли более быстрый способ?

тут очень важно знать - что хотите получить на выходе? Если например Вам нужно отсортировать их - то всё гораздо проще :)

если речь вести чисто о чтении с диска, то надо читать как можно более элементарными средствами оси блоками размером соизмеримыми по времени обработке с временем чтения этих блоков. Это и будет оптимум (подсказка дня - почему индексные страницы у локальных баз данных единицы килобайт?).

удачи вам
(круглый)

ЗЫ
А что значит запись
1024 * 1024 / sizeof(int)
????

это типа
1 048 576 интов
или
1 048 576 разделить на размерность инта

????
...
Рейтинг: 0 / 0
как быстрее всего прочесть большой файл с числами, каждое с новой строки?
    #39115559
log_here
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kolobok0тут очень важно знать - что хотите получить на выходе? Если например Вам нужно отсортировать их - то всё гораздо проще :)
Например, хочу прочесть и пересчитать какие-то особенные элементы (скажем, бОльшие, чем 100).

kolobok0ЗЫ
А что значит запись
1024 * 1024 / sizeof(int)
????

1 048 576 разделить на размерность инта

???? вторая версия -- правильная.

Правильно, читаешь блок байтиков и расшифровываешь их из буфера в массив.
Ну так я и прошу простейший способ (код) того, как это сделать.
...
Рейтинг: 0 / 0
как быстрее всего прочесть большой файл с числами, каждое с новой строки?
    #39115563
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
log_here...прочесть и пересчитать какие-то особенные элементы (скажем, бОльшие, чем 100).

1 048 576 разделить на размерность инта

...как это сделать.

1) эту задачу необходимо сразу делать по ходу чтения(на это как бы намекает большие величины для хранения всего)..
2) а теперь переведите свой вопрос на русский:
...почему файл с (1 048 576 разделить на размерность инта) числами занимает ощутимо больше, чем 1 МБ, даже если числа внутри файла ничем не разделены?
в переводе вопроса, необходимо указать а) размерность инта б) тип числа в который пишется (1 048 576 разделить на размерность инта)
3) как это сделать =
цикл. в цикле чтение фрагмента файла, вычисление того чего нужно.
написать код, запостить сюда, Вам укажут на недочёты и в какую сторону двигаться дальше...
ну либо в раздел работа и нанимаете того, кто это сделает за бабки. но лучше самому...

удачи вам
(круглый)
...
Рейтинг: 0 / 0
как быстрее всего прочесть большой файл с числами, каждое с новой строки?
    #39115634
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
log_hereЕсли есть ещё более быстрый способ -- ещё лучше.

Есть: один поток читает блоками, второй обрабатывает. Т.к. самое узкое место тут чтение с диска, то оно должно быть непрерывным.
...
Рейтинг: 0 / 0
как быстрее всего прочесть большой файл с числами, каждое с новой строки?
    #39115636
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima Tодин поток читает блоками, второй обрабатывает.
Человек простое чтение и обработку написать не может, а ты ему предлагаешь потоки
синхронизировать?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
как быстрее всего прочесть большой файл с числами, каждое с новой строки?
    #39115650
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
log_here, лучшее - враг хорошего.

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

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
     void f(const std::string& file_name)
     {
	std::ifstream stream(file_name, std::ios::in);
           std::list<int> list;

	int x;
	while(stream >> x)
	{
                 list.push_back(x);
                 if (list.size() == 1000 * 1000 * 1000)
                 {
                        // что-то сделать с list
                        list.resize(0);
                 }
	}
            
            // и здесь обработать оставшийся list
 
	
	stream.close();
      }



Но, как я указывал, здесь элементы заходят по одному, а не пачкой, что гораздо медленнее.
...
Рейтинг: 0 / 0
как быстрее всего прочесть большой файл с числами, каждое с новой строки?
    #39115689
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
log_hereздесь элементы заходят по одному, а не пачкой, что гораздо медленнее.

Во-первых, увеличь ему буфер до 32-64к, как показано здесь:
http://en.cppreference.com/w/cpp/io/basic_streambuf/pubsetbuf
Во-вторых, избавься от набивания чисел в список, это медленная операция.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
как быстрее всего прочесть большой файл с числами, каждое с новой строки?
    #39115706
log_here
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

buf1 работает быстрее buf2 всего лишь в 2 раза, а не в 10, как я ожидал.

Код: 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.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
#include <fstream>
#include <iterator>
#include <string>
#include <vector>
#include <sstream>
#include <time.h>

void buf1()
{
	const clock_t begin_time = clock();
	
	std::vector<int> v(1000000);
	
	int cnt = -1;
	std::ifstream file;
	char buf[1024 * 64];
	
	file.rdbuf()->pubsetbuf(buf, sizeof buf);
	file.open("./input.txt");
	
	for (std::string line; getline(file, line);) {
		v[++cnt] = std::stoi(line);
	}
	
	std::cout << float( 1000 * (clock () - begin_time )) /  CLOCKS_PER_SEC << std::endl;
}

void buf2()
{
	const clock_t begin_time = clock();
	
	std::string file_name("./input.txt");
	
	std::ifstream stream(file_name, std::ios::in);
	std::list<int> list;

	
	std::vector<int> v(10000000);
	int idx = -1;

	int x;
	while(stream >> x)
	{
		v[++idx] =  x;
	}
	
	stream.close();
	
	std::cout << float( 1000 * (clock () - begin_time )) /  CLOCKS_PER_SEC << std::endl;
}

int main(int argc, _TCHAR* argv[])
{
	buf1();
	buf2();
	while (1);
	return 0;
}
...
Рейтинг: 0 / 0
как быстрее всего прочесть большой файл с числами, каждое с новой строки?
    #39115718
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Избавься от getline.

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

как избавляться от getline?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
   // вместо
   //for (std::string line; getline(file, line);) {
   //	v[++cnt] = std::stoi(line);
   //}

   // записал
   int x;
   while(file >> x)
   {
      v[++cnt] =  x;
   }



время только увеличилось.

про время: в файле input.txt 1 000 000 элементов, читается за 1.3 с и 2.6 с соответствунно.
...
Рейтинг: 0 / 0
как быстрее всего прочесть большой файл с числами, каждое с новой строки?
    #39115732
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
log_hereкак избавляться от getline?
Используй массив char вместо string и file.getline.

Какую букву из "мегабайты в секунду" ты не понял?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
как быстрее всего прочесть большой файл с числами, каждое с новой строки?
    #39115740
log_here
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
7.8 МБ / 1.3 c = 6 МБ/c и
7.8 МБ / 2.6 c = 3 МБ/c

сообветственно.

Dimitry SibiryakovИспользуй массив char вместо string и file.getline.

Не мог бы расписать?
...
Рейтинг: 0 / 0
как быстрее всего прочесть большой файл с числами, каждое с новой строки?
    #39115757
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
log_hereНе мог бы расписать?
Читаешь блок X байт (символов). Дальше разбираешь посимвольно. Примерно так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Н = 0
цикл: прочитать блок символов
  цикл: прочитать очередной символ блока в С
    если С = 0-9
        Н = Н*10 + С
    иначе  // С = перевод строки
       если Н != 0 записать Н в массив результатов
       Н = 0
   конец цикла
конец цикла


0 замени на недопустимое значение, если невозможно - добавь флаг.
...
Рейтинг: 0 / 0
как быстрее всего прочесть большой файл с числами, каждое с новой строки?
    #39115892
Зимаргл
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тесты, что я видел, показывают что потоки (iostreams) С++ работают довольно медленно.

Соответственно, хотите скорость - читайте и парсите напрямую.
Хотя почему так - хз, они не для скорости предназначены изначально.

Кому надо, пусть ковыряет подробности.
Я как-то смотрел генерированный ассемблер, он был ужасен =)
...
Рейтинг: 0 / 0
как быстрее всего прочесть большой файл с числами, каждое с новой строки?
    #39115900
log_here
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Написал так, работает быстрее.
Только как понять, что достигнут конец файла, ведь так можно до бесконечности цикл с "i" проходить?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
void buf3()
{
	const clock_t begin_time = clock();
	
	std::ifstream ifs("./input_file.txt", std::ios::binary);
	char buff[32 * 512];

	for (int i = 0; ; ++i){
		ifs.read(buf, sizeof(buff) / sizeof(*buff));
		for (int j = 0; j < 32 * 512; ++j){
			if (buff[j] == '-'){
			} else if(buff[j] == '\n') {
			} else {
				// Обрабатываем '0' - '9'
			}
		}
		//std::cout << std::endl;
	}
	
	std::cout << float( 1000 * (clock () - begin_time )) /  CLOCKS_PER_SEC << std::endl;
}
...
Рейтинг: 0 / 0
как быстрее всего прочесть большой файл с числами, каждое с новой строки?
    #39115908
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посмотри как тут пишут.

http://www.cplusplus.com/reference/istream/istream/read/

Вообще по настоящему перформить с файлами надо без std. IMHO.
...
Рейтинг: 0 / 0
как быстрее всего прочесть большой файл с числами, каждое с новой строки?
    #39115926
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
log_hereДопустим, есть файл, состоящий из 100 000 000 000 чисел int, каждое число записано с новой строчки.
Надо последовательно его прочесть. Мне кажется, будет намного быстрее, если читать не число за числом, а сразу много чисел читать и загружать в локальный массив (вектор), проводя загрузку несколько раз.

Как можно это сделать?
Если есть ещё более быстрый способ -- ещё лучше.

я знаю, что можно использовать [code cpp] std::fstream[code],
но есть ли более быстрый способ?


на самом деле все равно, как читать.
лишь бы не посимвольно.
если читать строку gets() или аналогом, то будет вполне хорошо.
...
Рейтинг: 0 / 0
как быстрее всего прочесть большой файл с числами, каждое с новой строки?
    #39115927
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
log_hereИ ещё вопрос: почему файл с
Код: plaintext
1.
1024 * 1024 / sizeof(int)

числами занимает ощутимо больше, чем 1 МБ, даже если числа внутри файла ничем не разделены?

во первых, они таки разделены, переводами строк (1 или2символов)
во вторых, числа наверняка записаны как строки, поэтому надо считать не как size of int , а порядок числа, умножить на size of char.
...
Рейтинг: 0 / 0
как быстрее всего прочесть большой файл с числами, каждое с новой строки?
    #39115929
log_here
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivна самом деле все равно, как читать.
лишь бы не посимвольно.
если читать строку gets() или аналогом, то будет вполне хорошо.
лишь бы не посимвольно -- это лишь бы не как в buf3()?
...
Рейтинг: 0 / 0
как быстрее всего прочесть большой файл с числами, каждое с новой строки?
    #39115974
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
log_hereНаписал так, работает быстрее.
Только как понять, что достигнут конец файла, ведь так можно до бесконечности цикл с "i" проходить?

Читай хэлп на std::istream::read()

И проверка у тебя не очень корректная. Что будет если встретятся последовательности "12-345", "12x345" ?
...
Рейтинг: 0 / 0
как быстрее всего прочесть большой файл с числами, каждое с новой строки?
    #39116394
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
log_hereлишь бы не посимвольно -- это лишь бы не как в buf3()?

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


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