From 487c9d09fa18989b1f93951e17893f10109a97fa Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jos=C3=A9=20Fonseca?= Date: Sat, 3 Sep 2011 14:17:29 +0100 Subject: [PATCH] Don't decompress blocks that we'll skip. Should help when skipping very big blobs, but don't have such trace handy now. --- trace_snappyfile.cpp | 10 ++++++---- trace_snappyfile.hpp | 2 +- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/trace_snappyfile.cpp b/trace_snappyfile.cpp index ad3dc72..1794a82 100644 --- a/trace_snappyfile.cpp +++ b/trace_snappyfile.cpp @@ -211,7 +211,7 @@ void SnappyFile::flushWriteCache() assert(m_cachePtr == m_cache); } -void SnappyFile::flushReadCache() +void SnappyFile::flushReadCache(size_t skipLength) { //assert(m_cachePtr == m_cache + m_cacheSize); m_currentOffset.chunk = m_stream.tellg(); @@ -223,8 +223,10 @@ void SnappyFile::flushReadCache() ::snappy::GetUncompressedLength(m_compressedCache, compressedLength, &m_cacheSize); createCache(m_cacheSize); - ::snappy::RawUncompress(m_compressedCache, compressedLength, - m_cache); + if (skipLength < m_cacheSize) { + ::snappy::RawUncompress(m_compressedCache, compressedLength, + m_cache); + } } else { createCache(0); } @@ -315,7 +317,7 @@ bool SnappyFile::rawSkip(size_t length) m_cachePtr += chunkSize; sizeToRead -= chunkSize; if (sizeToRead > 0) { - flushReadCache(); + flushReadCache(sizeToRead); } if (!m_cacheSize) { break; diff --git a/trace_snappyfile.hpp b/trace_snappyfile.hpp index bfb3dff..469f29e 100644 --- a/trace_snappyfile.hpp +++ b/trace_snappyfile.hpp @@ -84,7 +84,7 @@ private: return m_stream.eof() && freeCacheSize() == 0; } void flushWriteCache(); - void flushReadCache(); + void flushReadCache(size_t skipLength = 0); void createCache(size_t size); void writeCompressedLength(size_t length); size_t readCompressedLength(); -- 2.7.4