2012-12-10 12 views
5

ich eine große Datei von Daten habe ich mit Zlib komprimiert boost iostreams mit und Filterstrompuffer:Boost-IO-Stream und ZLib beschleunigen

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

Für Geschwindigkeit Ich bin Initialisierung der zlib-Bibliothek mit dem folgenden:

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

Meine Dekomprimierer wie folgt aussieht:

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

Meine Frage gibt es eine Auf welche Art und Weise kann ich den Vorgang des Aufblasens (Dekomprimierens) beschleunigen? Momentan beansprucht die Komprimierung etwa 83% meiner Datenzugriffszeit und ich muss diese Geschwindigkeit wirklich erhöhen. Irgendwelche Vorschläge würden sehr geschätzt werden.

Antwort

3

Die einzige Möglichkeit, die Dekomprimierung zu beschleunigen, besteht darin, die komprimierten Daten zu verkleinern, damit weniger verarbeitet werden muss. Das bedeutet, dass Sie mehr Zeit für die Komprimierung aufwenden müssen, vorausgesetzt, Sie sind nicht so besorgt über die Verarbeitungszeit an diesem Ende. Sie würden also die beste Komprimierung auswählen.

1

Zumindest unter Windows haben wir eine 20% ige Verbesserung mit der zlib C-Schnittstelle gemessen. Nach dem Close-Profiling stellte sich heraus, dass boost :: iostreams :: filtering_streambuf & iostream overhead der Hauptunterschied war.