У меня есть большой файл данных, который я сжал с помощью Zlib с помощью ускоренного IOStreams и фильтрации потоковых буферов:
boost::iostreams::array_source uncompressedArray( reinterpret_cast< const char* >( &uncompressedData[0] ), uncompressedData.size() );
boost::iostreams::filtering_streambuf< boost::iostreams::output > out;
out.push( *m_compressor );
out.push( boost::iostreams::char_back_inserter( compressedData ) );
boost::iostreams::copy( uncompressedArray, out );
Для скорости я инициализирую библиотеку zlib следующим образом:
boost::iostreams::zlib_params params;
params.level = boost::iostreams__zlib::best_speed;
params.mem_level = 9;
m_compressor.reset( new boost::iostreams::zlib_compressor( params, 131072 ) );
m_decompressor.reset( new boost::iostreams::zlib_decompressor( params, 131072 ) );
Мой декомпрессор выглядит так:
boost::iostreams::array_source compressedArray( reinterpret_cast< const char* >( &compressedData[0] ), compressedData.size() );
boost::iostreams::filtering_streambuf< boost::iostreams::input > m_in;
m_in.push( *m_decompressor );
m_in.push( compressedArray );
boost::iostreams::copy( m_in, boost::iostreams::char_back_inserter( uncompressedData ) );
Мой вопрос: есть ли способы ускорить операцию раздувания (распаковки)? В настоящее время сжатие занимает около 83% моего времени доступа к данным, и мне действительно нужно ускорить его. Любые предложения будут ценны.
Единственный способ ускорить распаковку — уменьшить сжатые данные, чтобы их было меньше для обработки. Это означает, что нужно тратить больше времени на сжатие, предполагая, что вы не так озабочены временем обработки на этом конце. Таким образом, вы выбрали бы лучшее сжатие.
По крайней мере, в Windows мы измерили улучшение на 20% с помощью интерфейса zlib C. После тщательного профилирования оказалось, что boost :: iostreams :: filtering_streambuf & iostream накладные расходы были основным отличием.