Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
2 / 2 / 0
Регистрация: 08.01.2016
Сообщений: 491

Чтение бинарного файла большого объема (300 Гб)

06.01.2020, 18:08. Показов 3405. Ответов 4

Студворк — интернет-сервис помощи студентам
Добрый день,

Мне необходимо считывать каждые 996-1000 байты формата int из файла объемом 300 Гигабайт и делать так пока не достигну конца файла. Для этого мне необходимо выбрать наиболее эффективный способ чтения. Я хочу протестировать istream::read/istream::seekg и fread/fseek.
У меня возникают вопросы по использованию istream::read. Не могу понять, если считываемые 996-1000 байты формата int, то как использовать этот метод istream::read? Для типа char я бы использовал такой код:
C++
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
// read a file into memory
#include <iostream>     // std::cout
#include <fstream>      // std::ifstream
 
int main ()
{
    char segyFile[]{"C:/Users/tasik/Documents/Qt_Projects/raw.bin"};
 
    std::ifstream is (segyFile, std::ifstream::binary);
    if (is) {
        // get length of file:
        is.seekg (0, is.end);
        unsigned long int length = is.tellg();
        is.seekg (0, is.beg);
 
        // allocate memory:
        int bufSize = sizeof(int);
        char * buffer = new char [bufSize];
 
        unsigned long int N = floor(length/1000);
        for(unsigned long int i = 0; i < N; i++){
            is.seekg (996, is.cur);
            // read data as a block:
            is.read(buffer, bufSize);
        }
 
        is.close();
 
        delete[] buffer;
    }
}
Но как мне читать данные другого типа (например int)?
А в перспективе хотелось бы попробовать чтение используя многоядерность процессора
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.01.2020, 18:08
Ответы с готовыми решениями:

Работа с файлами большого объёма (300-500 Мб)
Приветствую. Есть цель написать программу, смысл которой в следующем: В двоичном файле записаны шестнадцатиричные слова данных из...

Чтение большого объема данных
Доброго времени суток. У меня есть файлик (.тхт), в нем очень много числовых значений, которые мне нужны для анализа данных (не важно...

Импорт большого объема информации из txt файла
Добрый день, уважаемые форумчане! В общем дело обстоит так. Имеется txt фаил с более чем 24000 тысячами значений. Матлаб не хочет...

4
Мозгоправ
 Аватар для L0M
1745 / 1039 / 468
Регистрация: 01.10.2018
Сообщений: 2,138
Записей в блоге: 2
06.01.2020, 18:46
Лучший ответ Сообщение было отмечено Kerim_Geophysic как решение

Решение

Цитата Сообщение от Kerim_Geophysic Посмотреть сообщение
Но как мне читать данные другого типа (например int)?
Примерно так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// read a file into memory
#include <iostream>     // std::cout
#include <fstream>      // std::ifstream
 
int main ()
{
    char segyFile[]{"C:/Users/tasik/Documents/Qt_Projects/raw.bin"};
 
    std::ifstream is (segyFile, std::ifstream::binary);
    if (is) {
        // allocate memory:
        int buffer;
 
        while (is.read((char *)&buffer, sizeof(int))) {
            // что-то делаем со значением в buffer
            is.seekg (996, is.cur);
        }
 
        is.close();
    }
}
Цитата Сообщение от Kerim_Geophysic Посмотреть сообщение
А в перспективе хотелось бы попробовать чтение используя многоядерность процессора
Не заморачивайтесь. Скорость доступа к диску сильно меньше скорости ядра. Остальные ядра будут простаивать пока одно обработает обращение к диску.
2
2 / 2 / 0
Регистрация: 08.01.2016
Сообщений: 491
06.01.2020, 19:51  [ТС]
L0M, спасибо большое! на кнопку нажал
не могли бы Вы, пожалуйста, пояснить вот эту конструкцию:
C++
1
is.read((char *)&buffer, sizeof(int))
0
Мозгоправ
 Аватар для L0M
1745 / 1039 / 468
Регистрация: 01.10.2018
Сообщений: 2,138
Записей в блоге: 2
06.01.2020, 20:25
Kerim_Geophysic, читайте доки - они рулез (с) не мой
Если в двух словах, то istream::read() получает на вход адрес буфера (массив байтов), куда будут помещаться считанные данные, и количество байтов данных. У нас buffer - типа int, и его размер sizeof(int). Берём адрес этой переменной, приводим его к char * (т.е. фактически говорим, что есть некий кусок памяти, с которым можно обращаться как с массивом байт), и это передаём методу read().
2
2 / 2 / 0
Регистрация: 08.01.2016
Сообщений: 491
06.01.2020, 21:01  [ТС]
L0M, спасибо за разъяснение, более или менее врубился))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.01.2020, 21:01
Помогаю со студенческими работами здесь

Чтение бинарного файла - чтение первых 9 байт
Есть код, который читает первые 9 байт бинарного файла(заголовок записи) void ATS44Encoder::FileEncode() { QFile* file = new...

Считывание с бинарного файла большого массива и дальнейшая работа с ним
Здравствуйте. Подскажите пожалуйста. В общем передо мной стоит задача считать информацию из бинарных файлов разных размеров от 1 Mb,...

Внешняя сортировка бинарного файла (чтение после конца файла невозможно)
Помогите отладить программу, не вижу, что здесь можно сделать. Похоже, курсор файла где-то в коде сортировки доходит до конца, но потом все...

Чтение нескольких структур и одной переменной из бинарного файла. Формат файла имеется
Формат файла состоит из 3 структур и одной переменной. Подробное описание формата во вложении, просьба посмотреть его. У меня возникла...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru