27#include <unordered_map>
73 void put(uint16_t tileIndex, std::shared_ptr<TPFetchSeq> seq)
75 if(!seq || seq->empty())
78 std::lock_guard<std::mutex> lock(
mutex_);
84 if(it->second.inMemory)
91 entry.
seq = std::move(seq);
96 entries_[tileIndex] = std::move(entry);
110 std::shared_ptr<TPFetchSeq>
get(uint16_t tileIndex)
112 std::lock_guard<std::mutex> lock(
mutex_);
118 auto& entry = it->second;
136 std::lock_guard<std::mutex> lock(
mutex_);
142 std::lock_guard<std::mutex> lock(
mutex_);
153 std::lock_guard<std::mutex> lock(
mutex_);
162 std::lock_guard<std::mutex> lock(
mutex_);
169 std::shared_ptr<TPFetchSeq>
seq;
177 for(
size_t i = 0; i < seq.
size(); ++i)
179 const auto& tp = seq[i];
181 total += tp->length_;
195 auto it =
lruMap_.find(tileIndex);
205 auto it =
lruMap_.find(tileIndex);
227 auto& entry = it->second;
252 auto& seq = *entry.
seq;
253 uint16_t numParts =
static_cast<uint16_t
>(seq.size());
256 size_t headerSize =
sizeof(uint16_t) + numParts * (
sizeof(uint64_t) +
sizeof(uint64_t));
258 for(
size_t i = 0; i < numParts; ++i)
260 if(seq[i] && seq[i]->data_)
261 dataSize += seq[i]->length_;
264 std::vector<uint8_t> buf(headerSize + dataSize);
265 uint8_t* ptr = buf.data();
268 std::memcpy(ptr, &numParts,
sizeof(numParts));
269 ptr +=
sizeof(numParts);
271 for(
size_t i = 0; i < numParts; ++i)
273 uint64_t offset = seq[i] ? seq[i]->offset_ : 0;
274 uint64_t length = seq[i] ? seq[i]->length_ : 0;
275 std::memcpy(ptr, &offset,
sizeof(offset));
276 ptr +=
sizeof(offset);
277 std::memcpy(ptr, &length,
sizeof(length));
278 ptr +=
sizeof(length);
282 for(
size_t i = 0; i < numParts; ++i)
284 if(seq[i] && seq[i]->data_)
286 std::memcpy(ptr, seq[i]->data_.get(), seq[i]->length_);
287 ptr += seq[i]->length_;
291 diskCache_->store(tileIndex, buf.data(), buf.size());
294 for(
size_t i = 0; i < numParts; ++i)
298 seq[i]->data_.reset();
299 seq[i]->stream_.reset();
300 seq[i]->fetchOffset_ = 0;
317 if(!blob.has_value())
320 auto& data = blob.value();
321 const uint8_t* ptr = data.data();
322 const uint8_t* end = ptr + data.size();
324 if(
static_cast<size_t>(end - ptr) <
sizeof(uint16_t))
328 std::memcpy(&numParts, ptr,
sizeof(numParts));
329 ptr +=
sizeof(numParts);
331 auto& seq = *entry.
seq;
332 if(numParts !=
static_cast<uint16_t
>(seq.size()))
335 size_t headerRemaining = numParts * (
sizeof(uint64_t) +
sizeof(uint64_t));
336 if(
static_cast<size_t>(end - ptr) < headerRemaining)
340 ptr += headerRemaining;
343 for(
size_t i = 0; i < numParts; ++i)
345 uint64_t length = seq[i] ? seq[i]->length_ : 0;
348 if(
static_cast<size_t>(end - ptr) < length)
351 seq[i]->data_ = std::make_unique<uint8_t[]>(length);
352 std::memcpy(seq[i]->data_.get(), ptr, length);
353 seq[i]->fetchOffset_ = length;
354 seq[i]->stream_ = std::unique_ptr<IStream>(
375 const char* env = std::getenv(
"GRK_CACHEMAX");
377 env = std::getenv(
"GDAL_CACHEMAX");
385 char suffix = s.back();
386 if(suffix ==
'M' || suffix ==
'm')
387 return static_cast<size_t>(std::stoull(s.substr(0, s.size() - 1))) * 1024 * 1024;
388 if(suffix ==
'G' || suffix ==
'g')
389 return static_cast<size_t>(std::stoull(s.substr(0, s.size() - 1))) * 1024 * 1024 * 1024;
391 return static_cast<size_t>(std::stoull(s));
406 std::unordered_map<uint16_t, std::list<uint16_t>::iterator>
lruMap_;
size_t size() const
Definition CompressedChunkCache.h:160
static size_t resolveMaxBytes(size_t provided)
Resolve max bytes from environment or use provided value.
Definition CompressedChunkCache.h:370
size_t maxBytes_
Definition CompressedChunkCache.h:399
void put(uint16_t tileIndex, std::shared_ptr< TPFetchSeq > seq)
Register a tile's fetched data with the cache.
Definition CompressedChunkCache.h:73
GRK_CODEC_FORMAT codecFormat_
Definition CompressedChunkCache.h:402
bool reloadFromDisk(uint16_t tileIndex, Entry &entry)
Reload tile part data from disk into the existing TPFetch objects.
Definition CompressedChunkCache.h:311
std::list< uint16_t > lruList_
Definition CompressedChunkCache.h:405
std::shared_ptr< DiskCache > diskCache_
Definition CompressedChunkCache.h:401
void evictToFit()
Definition CompressedChunkCache.h:213
void promoteLRU(uint16_t tileIndex)
Definition CompressedChunkCache.h:203
static constexpr size_t kDefaultMaxBytes
Definition CompressedChunkCache.h:397
size_t maxBytes() const
Definition CompressedChunkCache.h:156
bool contains(uint16_t tileIndex) const
Check if a tile is tracked (memory or disk).
Definition CompressedChunkCache.h:134
void clear()
Definition CompressedChunkCache.h:140
void pushFrontLRU(uint16_t tileIndex)
Definition CompressedChunkCache.h:187
std::unordered_map< uint16_t, std::list< uint16_t >::iterator > lruMap_
Definition CompressedChunkCache.h:406
std::unordered_map< uint16_t, Entry > entries_
Definition CompressedChunkCache.h:407
void spillToDisk(uint16_t tileIndex, Entry &entry)
Serialize tile part data to disk and release in-memory buffers.
Definition CompressedChunkCache.h:247
size_t currentBytes() const
Definition CompressedChunkCache.h:151
std::shared_ptr< TPFetchSeq > get(uint16_t tileIndex)
Ensure a tile's compressed data is in memory.
Definition CompressedChunkCache.h:110
static size_t calcSeqDataSize(const TPFetchSeq &seq)
Definition CompressedChunkCache.h:174
void removeLRU(uint16_t tileIndex)
Definition CompressedChunkCache.h:193
size_t currentBytes_
Definition CompressedChunkCache.h:400
std::mutex mutex_
Definition CompressedChunkCache.h:404
CompressedChunkCache(size_t maxBytes=0, std::shared_ptr< DiskCache > diskCache=nullptr, GRK_CODEC_FORMAT codecFormat=GRK_CODEC_J2K)
Construct the cache.
Definition CompressedChunkCache.h:61
enum _GRK_CODEC_FORMAT GRK_CODEC_FORMAT
Grok Supported JPEG 2000 formats.
@ GRK_CODEC_J2K
unknown format
Definition grok.h:322
ResWindow.
Definition CompressedChunkCache.h:36
IStream * memStreamCreate(uint8_t *buf, size_t len, bool ownsBuffer, grk_stream_free_user_data_fn freeCallback, GRK_CODEC_FORMAT format, bool isReadStream)
Create stream from buffer.
Definition MemStream.cpp:153
Definition CompressedChunkCache.h:168
std::shared_ptr< TPFetchSeq > seq
Definition CompressedChunkCache.h:169
bool inMemory
Definition CompressedChunkCache.h:170
size_t dataSize
Definition CompressedChunkCache.h:171
size_t size() const
Returns number of objects in store.
Definition TPFetchSeq.h:81
Definition TPFetchSeq.h:225