Я имею 3 терабайта .gz файл и хочу считать его несжатое содержание линию за линией в программе C++. Поскольку файл довольно огромен, я не хочу загружать его полностью в памяти.
Кто-либо может отправить простой пример выполнения его?
Библиотека zlib поддерживает распаковку файлов в памяти блоками, поэтому вам не нужно распаковывать весь файл, чтобы обработать его.
Для чего-то, что будет использоваться регулярно, вы, вероятно, захотите использовать одно из предыдущих предложений. В качестве альтернативы, вы можете сделать
gzcat file.gz | yourprogram
и попросить вашу программу
читать из cin. Это распакует части файла в памяти по мере необходимости и отправит несжатый вывод на yourprogram
.
Скорее всего, вам придется использовать deflate ZLib, пример доступен на их сайте
В качестве альтернативы вы можете взглянуть на BOOST C ++ wrapper
Пример со страницы BOOST (распаковывает данные из файла и записывает их в стандартный вывод)
#include <fstream>
#include <iostream>
#include <boost/iostreams/filtering_streambuf.hpp>
#include <boost/iostreams/copy.hpp>
#include <boost/iostreams/filter/zlib.hpp>
int main()
{
using namespace std;
ifstream file("hello.z", ios_base::in | ios_base::binary);
filtering_streambuf<input> in;
in.push(zlib_decompressor());
in.push(file);
boost::iostreams::copy(in, cout);
}
Вы не можете этого сделать, потому что *.gz не имеет "линий".
Если сжатые данные содержат новые строки, вам придется их распаковать. Не обязательно распаковывать все данные сразу, можно делать это частями и посылать строки обратно в основную программу, когда встречаются символы новой строки. *.gz можно распаковать с помощью zlib.
Chilkat ( http://www.chilkatsoft.com/ ) имеет библиотеки для чтения сжатых файлов из приложений C ++, .Net, VB, ....