2012-12-10 11 views
5

Mam dużego pliku danych Mam skompresowanym Zlib użyciu iostreams Boost i bufory strumieniowych filtrowanie:doładowania IO Stream i ZLib przyspieszyć

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); 

Dla prędkości ja inicjalizacji biblioteki zlib z następujących czynności:

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)); 

Moja dekompresor wygląda następująco:

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)); 

Moje pytanie brzmi, są tam Czy mogę przyspieszyć proces nadmuchania (dekompresji)? Obecnie kompresja zajmuje około 83% czasu dostępu do danych i naprawdę muszę to przyspieszyć. Wszelkie sugestie będą bardzo mile widziane.

Odpowiedz

3

Jedynym sposobem na przyspieszenie dekompresji jest zmniejszenie rozmiaru skompresowanych danych, aby proces ten był mniejszy. Oznacza to, że trzeba poświęcić więcej czasu na kompresję, zakładając, że nie martwisz się o czas przetwarzania w tym celu. Więc wybierz najlepszą kompresję.

1

Przynajmniej na Windowsie zmierzyliśmy 20% poprawę używając interfejsu zlib C. Po dokładnym profilowaniu okazało się, że główną różnicą była funkcja: boost :: iostreams :: filtering_streambuf & iostream overhead.