From b587042215dc3ff7312674eff681617a45c514b5 Mon Sep 17 00:00:00 2001 From: Marcus Holland-Moritz Date: Thu, 22 May 2025 13:54:17 +0200 Subject: [PATCH] chore(segmenter): add debug logging with memory usage information --- src/writer/segmenter.cpp | 36 +++++++++++++++++++++++++++++++----- 1 file changed, 31 insertions(+), 5 deletions(-) diff --git a/src/writer/segmenter.cpp b/src/writer/segmenter.cpp index 1cc6523a..a3215e47 100644 --- a/src/writer/segmenter.cpp +++ b/src/writer/segmenter.cpp @@ -149,16 +149,28 @@ class fast_multimap { return false; } - void clear() { - values_.clear(); - collisions_.clear(); - } - DWARFS_FORCE_INLINE blockhash_t const& values() const { return values_; }; DWARFS_FORCE_INLINE collision_t const& collisions() const { return collisions_; }; + size_t memory_usage() const { + auto phmap_mem = [](T const& m) { + return m.capacity() * sizeof(typename T::slot_type) + m.capacity() + 1; + }; + + auto mem = phmap_mem(values_) + phmap_mem(collisions_); + + for (auto const& c : collisions_) { + if (c.second.size() > MaxCollInline) { + mem += + c.second.capacity() * sizeof(typename collision_vector::value_type); + } + } + + return mem; + } + private: blockhash_t values_; collision_t collisions_; @@ -245,6 +257,8 @@ class alignas(64) bloom_filter { std::transform(cbegin(), cend(), other.cbegin(), begin(), std::bit_or<>{}); } + size_t memory_usage() const { return size_ / 8; } + private: DWARFS_FORCE_INLINE bits_type const* cbegin() const { return bits_; } DWARFS_FORCE_INLINE bits_type const* cend() const { @@ -592,6 +606,18 @@ class active_block : private GranularityPolicy { data_.reserve(this->frames_to_bytes(capacity_in_frames_)); } + ~active_block() { + LOG_DEBUG << "block " << num_ << " destroyed, " + << size_with_unit(offsets_.memory_usage()) << " offset memory (" + << fmt::format("{:.1f}", + static_cast(offsets_.memory_usage()) / + offsets_.values().size()) + << " bytes per offset, " << offsets_.values().size() + << " offsets, " << offsets_.collisions().size() + << " collisions), " << size_with_unit(filter_.memory_usage()) + << " bloom filter"; + } + DWARFS_FORCE_INLINE size_t num() const { return num_; } DWARFS_FORCE_INLINE size_t size_in_frames() const {