Skip to content

Commit c1e3427

Browse files
authored
Add memory tracking for RTree. (#4697)
Add MemoryTracker to RTree using `tdb::pmr` containers. --- TYPE: NO_HISTORY DESC: Add memory tracking for RTree.
1 parent 14e99dd commit c1e3427

File tree

8 files changed

+143
-162
lines changed

8 files changed

+143
-162
lines changed

tiledb/sm/fragment/fragment_metadata.cc

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ FragmentMetadata::FragmentMetadata(
8181
ContextResources* resources, shared_ptr<MemoryTracker> memory_tracker)
8282
: resources_(resources)
8383
, memory_tracker_(memory_tracker)
84+
, rtree_(RTree(nullptr, constants::rtree_fanout, memory_tracker_))
8485
, tile_offsets_(memory_tracker_->get_resource(MemoryType::TILE_OFFSETS))
8586
, tile_var_offsets_(memory_tracker_->get_resource(MemoryType::TILE_OFFSETS))
8687
, tile_var_sizes_(memory_tracker_->get_resource(MemoryType::TILE_OFFSETS))
@@ -119,7 +120,8 @@ FragmentMetadata::FragmentMetadata(
119120
, has_delete_meta_(has_deletes_meta)
120121
, sparse_tile_num_(0)
121122
, meta_file_size_(0)
122-
, rtree_(RTree(&array_schema_->domain(), constants::rtree_fanout))
123+
, rtree_(RTree(
124+
&array_schema_->domain(), constants::rtree_fanout, memory_tracker_))
123125
, tile_index_base_(0)
124126
, tile_offsets_(memory_tracker_->get_resource(MemoryType::TILE_OFFSETS))
125127
, tile_var_offsets_(memory_tracker_->get_resource(MemoryType::TILE_OFFSETS))
@@ -1576,7 +1578,7 @@ const NDRange& FragmentMetadata::mbr(uint64_t tile_idx) const {
15761578
return rtree_.leaf(tile_idx);
15771579
}
15781580

1579-
const std::vector<NDRange>& FragmentMetadata::mbrs() const {
1581+
const tdb::pmr::vector<NDRange>& FragmentMetadata::mbrs() const {
15801582
return rtree_.leaves();
15811583
}
15821584

tiledb/sm/fragment/fragment_metadata.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -783,7 +783,7 @@ class FragmentMetadata {
783783
const NDRange& mbr(uint64_t tile_idx) const;
784784

785785
/** Returns all the MBRs of all tiles in the fragment. */
786-
const std::vector<NDRange>& mbrs() const;
786+
const tdb::pmr::vector<NDRange>& mbrs() const;
787787

788788
/**
789789
* Retrieves the size of the tile when it is persisted (e.g. the size of the

tiledb/sm/rtree/rtree.cc

Lines changed: 23 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
*
66
* The MIT License
77
*
8-
* @copyright Copyright (c) 2017-2021 TileDB, Inc.
8+
* @copyright Copyright (c) 2024 TileDB, Inc.
99
*
1010
* Permission is hereby granted, free of charge, to any person obtaining a copy
1111
* of this software and associated documentation files (the "Software"), to deal
@@ -32,6 +32,7 @@
3232

3333
#include "tiledb/sm/rtree/rtree.h"
3434
#include "tiledb/common/logger.h"
35+
#include "tiledb/common/memory_tracker.h"
3536
#include "tiledb/sm/array_schema/dimension.h"
3637
#include "tiledb/sm/buffer/buffer.h"
3738
#include "tiledb/sm/enums/datatype.h"
@@ -53,43 +54,18 @@ namespace sm {
5354
/* CONSTRUCTORS & DESTRUCTORS */
5455
/* ****************************** */
5556

56-
RTree::RTree() {
57-
domain_ = nullptr;
58-
fanout_ = 0;
59-
deserialized_buffer_size_ = 0;
60-
}
61-
62-
RTree::RTree(const Domain* domain, unsigned fanout)
63-
: domain_(domain)
64-
, fanout_(fanout) {
57+
RTree::RTree(
58+
const Domain* domain,
59+
unsigned fanout,
60+
shared_ptr<MemoryTracker> memory_tracker)
61+
: memory_tracker_(memory_tracker)
62+
, domain_(domain)
63+
, fanout_(fanout)
64+
, levels_(memory_tracker_->get_resource(MemoryType::RTREE)) {
6565
}
6666

6767
RTree::~RTree() = default;
6868

69-
RTree::RTree(const RTree& rtree)
70-
: RTree() {
71-
auto clone = rtree.clone();
72-
swap(clone);
73-
}
74-
75-
RTree::RTree(RTree&& rtree) noexcept
76-
: RTree() {
77-
swap(rtree);
78-
}
79-
80-
RTree& RTree::operator=(const RTree& rtree) {
81-
auto clone = rtree.clone();
82-
swap(clone);
83-
84-
return *this;
85-
}
86-
87-
RTree& RTree::operator=(RTree&& rtree) noexcept {
88-
swap(rtree);
89-
90-
return *this;
91-
}
92-
9369
/* ****************************** */
9470
/* API */
9571
/* ****************************** */
@@ -240,7 +216,7 @@ const NDRange& RTree::leaf(uint64_t leaf_idx) const {
240216
return levels_.back()[leaf_idx];
241217
}
242218

243-
const std::vector<NDRange>& RTree::leaves() const {
219+
const tdb::pmr::vector<NDRange>& RTree::leaves() const {
244220
assert(!levels_.empty());
245221
return levels_.back();
246222
}
@@ -297,10 +273,10 @@ Status RTree::set_leaf(uint64_t leaf_id, const NDRange& mbr) {
297273
return Status::Ok();
298274
}
299275

300-
Status RTree::set_leaves(const std::vector<NDRange>& mbrs) {
276+
Status RTree::set_leaves(const tdb::pmr::vector<NDRange>& mbrs) {
301277
levels_.clear();
302278
levels_.resize(1);
303-
levels_[0] = mbrs;
279+
levels_[0].assign(mbrs.begin(), mbrs.end());
304280
return Status::Ok();
305281
}
306282

@@ -328,13 +304,21 @@ void RTree::deserialize(
328304
deserialize_v5(deserializer, domain);
329305
}
330306

307+
void RTree::reset(const Domain* domain, unsigned int fanout) {
308+
domain_ = domain;
309+
fanout_ = fanout;
310+
free_memory();
311+
}
312+
331313
/* ****************************** */
332314
/* PRIVATE METHODS */
333315
/* ****************************** */
334316

335317
RTree::Level RTree::build_level(const Level& level) {
336318
auto cur_mbr_num = (uint64_t)level.size();
337-
Level new_level((uint64_t)std::ceil((double)cur_mbr_num / fanout_));
319+
Level new_level(
320+
(uint64_t)std::ceil((double)cur_mbr_num / fanout_),
321+
memory_tracker_->get_resource(MemoryType::RTREE));
338322
auto new_mbr_num = (uint64_t)new_level.size();
339323

340324
uint64_t mbrs_visited = 0;
@@ -344,16 +328,7 @@ RTree::Level RTree::build_level(const Level& level) {
344328
domain_->expand_ndrange(level[mbrs_visited], &new_level[i]);
345329
}
346330

347-
return new_level;
348-
}
349-
350-
RTree RTree::clone() const {
351-
RTree clone;
352-
clone.domain_ = domain_;
353-
clone.fanout_ = fanout_;
354-
clone.levels_ = levels_;
355-
356-
return clone;
331+
return {new_level, memory_tracker_->get_resource(MemoryType::RTREE)};
357332
}
358333

359334
void RTree::deserialize_v1_v4(
@@ -424,11 +399,5 @@ void RTree::deserialize_v5(Deserializer& deserializer, const Domain* domain) {
424399
domain_ = domain;
425400
}
426401

427-
void RTree::swap(RTree& rtree) {
428-
std::swap(domain_, rtree.domain_);
429-
std::swap(fanout_, rtree.fanout_);
430-
std::swap(levels_, rtree.levels_);
431-
}
432-
433402
} // namespace sm
434403
} // namespace tiledb

tiledb/sm/rtree/rtree.h

Lines changed: 25 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
*
66
* The MIT License
77
*
8-
* @copyright Copyright (c) 2017-2021 TileDB, Inc.
8+
* @copyright Copyright (c) 2024 TileDB, Inc.
99
*
1010
* Permission is hereby granted, free of charge, to any person obtaining a copy
1111
* of this software and associated documentation files (the "Software"), to deal
@@ -36,6 +36,7 @@
3636
#include <vector>
3737

3838
#include "tiledb/common/common.h"
39+
#include "tiledb/common/pmr.h"
3940
#include "tiledb/common/status.h"
4041
#include "tiledb/sm/array_schema/domain.h"
4142
#include "tiledb/sm/misc/tile_overlap.h"
@@ -48,6 +49,7 @@ namespace sm {
4849

4950
class Buffer;
5051
class ConstBuffer;
52+
class MemoryTracker;
5153

5254
enum class Datatype : uint8_t;
5355
enum class Layout : uint8_t;
@@ -62,27 +64,19 @@ class RTree {
6264
/* ********************************* */
6365
/* CONSTRUCTORS & DESTRUCTORS */
6466
/* ********************************* */
67+
RTree() = delete;
6568

6669
/** Constructor. */
67-
RTree();
68-
69-
/** Constructor. */
70-
RTree(const Domain* domain, unsigned fanout);
70+
RTree(
71+
const Domain* domain,
72+
unsigned fanout,
73+
shared_ptr<MemoryTracker> memory_tracker);
7174

7275
/** Destructor. */
7376
~RTree();
7477

75-
/** Copy constructor. This performs a deep copy. */
76-
RTree(const RTree& rtree);
77-
78-
/** Move constructor. */
79-
RTree(RTree&& rtree) noexcept;
80-
81-
/** Copy-assign operator. This performs a deep copy. */
82-
RTree& operator=(const RTree& rtree);
83-
84-
/** Move-assign operator. */
85-
RTree& operator=(RTree&& rtree) noexcept;
78+
DISABLE_COPY_AND_COPY_ASSIGN(RTree);
79+
DISABLE_MOVE_AND_MOVE_ASSIGN(RTree);
8680

8781
/* ********************************* */
8882
/* API */
@@ -125,7 +119,7 @@ class RTree {
125119
const NDRange& leaf(uint64_t leaf_idx) const;
126120

127121
/** Returns the leaves of the tree. */
128-
const std::vector<NDRange>& leaves() const;
122+
const tdb::pmr::vector<NDRange>& leaves() const;
129123

130124
/**
131125
* Returns the number of leaves that are stored in a (full) subtree
@@ -158,7 +152,7 @@ class RTree {
158152
* Sets the input MBRs as leaves. This will destroy the existing
159153
* RTree.
160154
*/
161-
Status set_leaves(const std::vector<NDRange>& mbrs);
155+
Status set_leaves(const tdb::pmr::vector<NDRange>& mbrs);
162156

163157
/**
164158
* Resizes the leaf level. It destroys the upper levels
@@ -176,6 +170,14 @@ class RTree {
176170
void deserialize(
177171
Deserializer& deserializer, const Domain* domain, uint32_t version);
178172

173+
/**
174+
* Resets the RTree with the input domain and fanout.
175+
*
176+
* @param domain The domain to use for the RTree.
177+
* @param fanout The fanout of the RTree.
178+
*/
179+
void reset(const Domain* domain, unsigned fanout);
180+
179181
private:
180182
/* ********************************* */
181183
/* PRIVATE TYPE DEFINITIONS */
@@ -203,7 +205,7 @@ class RTree {
203205
* `levels_`, where the first level is the root. This is how
204206
* we can infer which tree level each `Level` object corresponds to.
205207
*/
206-
typedef std::vector<NDRange> Level;
208+
typedef tdb::pmr::vector<NDRange> Level;
207209

208210
/**
209211
* Defines an R-Tree level entry, which corresponds to a node
@@ -222,6 +224,9 @@ class RTree {
222224
/* PRIVATE ATTRIBUTES */
223225
/* ********************************* */
224226

227+
/** Memory tracker for the RTree. */
228+
shared_ptr<MemoryTracker> memory_tracker_;
229+
225230
/**
226231
* The domain for which this R-tree provides an index.
227232
*
@@ -237,7 +242,7 @@ class RTree {
237242
* The tree levels. The first level is the root. Note that the root
238243
* always consists of a single MBR.
239244
*/
240-
std::vector<Level> levels_;
245+
tdb::pmr::vector<Level> levels_;
241246

242247
/**
243248
* Stores the size of the buffer used to deserialize the data, used for
@@ -252,9 +257,6 @@ class RTree {
252257
/** Builds a single tree level on top of the input level. */
253258
Level build_level(const Level& level);
254259

255-
/** Returns a deep copy of this RTree. */
256-
RTree clone() const;
257-
258260
/**
259261
* Deserializes the contents of the object from the input buffer based
260262
* on the format version.
@@ -272,12 +274,6 @@ class RTree {
272274
* Applicable to versions >= 5
273275
*/
274276
void deserialize_v5(Deserializer& deserializer, const Domain* domain);
275-
276-
/**
277-
* Swaps the contents (all field values) of this RTree with the
278-
* given ``rtree``.
279-
*/
280-
void swap(RTree& rtree);
281277
};
282278

283279
} // namespace sm

tiledb/sm/rtree/test/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,5 +28,6 @@ include(unit_test)
2828

2929
commence(unit_test rtree)
3030
this_target_sources(main.cc unit_rtree.cc)
31+
this_target_link_libraries(tiledb_test_support_lib)
3132
this_target_object_libraries(rtree)
3233
conclude(unit_test)

tiledb/sm/rtree/test/compile_rtree_main.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,6 @@
2929
#include "../rtree.h"
3030

3131
int main() {
32-
tiledb::sm::RTree x{};
32+
tiledb::sm::RTree x{nullptr, 0, nullptr};
3333
return 0;
3434
}

0 commit comments

Comments
 (0)