From a80bbaa5bd245c86b4752a5d508b8a4eab5e9c0c Mon Sep 17 00:00:00 2001 From: Marcus Holland-Moritz Date: Thu, 22 Aug 2024 23:56:11 +0200 Subject: [PATCH] feat(metadata_v2): use bit-packing for hardlink table --- src/reader/internal/metadata_v2.cpp | 34 ++++++++++++++++++++++------- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/src/reader/internal/metadata_v2.cpp b/src/reader/internal/metadata_v2.cpp index 44edfb6f..263fbe50 100644 --- a/src/reader/internal/metadata_v2.cpp +++ b/src/reader/internal/metadata_v2.cpp @@ -20,6 +20,7 @@ */ #include +#include #include #include #include @@ -57,6 +58,7 @@ #include #include +#include #include #include @@ -862,13 +864,14 @@ class metadata_ final : public metadata_v2::impl { return decompressed; } - std::vector build_nlinks(metadata_options const& options) const { - std::vector nlinks; + packed_int_vector + build_nlinks(metadata_options const& options) const { + packed_int_vector packed_nlinks; if (options.enable_nlink) { - auto ti = LOG_TIMED_DEBUG; + auto td = LOG_TIMED_DEBUG; - nlinks.resize(dev_inode_offset_ - file_inode_offset_); + std::vector nlinks(dev_inode_offset_ - file_inode_offset_); if (auto de = meta_.dir_entries()) { for (auto e : *de) { @@ -886,11 +889,26 @@ class metadata_ final : public metadata_v2::impl { } } - ti << "built hardlink table (" - << size_with_unit(sizeof(nlinks.front()) * nlinks.capacity()) << ")"; + { + auto tt = LOG_TIMED_TRACE; + + uint32_t max = *std::max_element(nlinks.begin(), nlinks.end()); + packed_nlinks.reset(std::bit_width(max), nlinks.size()); + + for (size_t i = 0; i < nlinks.size(); ++i) { + packed_nlinks.set(i, nlinks[i]); + } + + tt << "packed hardlink table from " + << size_with_unit(sizeof(nlinks.front()) * nlinks.size()) << " to " + << size_with_unit(packed_nlinks.size_in_bytes()); + } + + td << "built hardlink table (" << packed_nlinks.size() << " entries, " + << size_with_unit(packed_nlinks.size_in_bytes()) << ")"; } - return nlinks; + return packed_nlinks; } size_t total_file_entries() const { @@ -910,7 +928,7 @@ class metadata_ final : public metadata_v2::impl { const int file_inode_offset_; const int dev_inode_offset_; const int inode_count_; - const std::vector nlinks_; + const packed_int_vector nlinks_; const std::vector chunk_table_; const std::vector shared_files_; const int unique_files_;