summaryrefslogtreecommitdiffstats
path: root/searchlib
diff options
context:
space:
mode:
authorGeir Storli <geirst@verizonmedia.com>2020-03-19 15:15:35 +0000
committerGeir Storli <geirst@verizonmedia.com>2020-03-19 15:16:54 +0000
commit9e9d9fe604ec193feb994b6d1570d37d3e4d451f (patch)
treedf6e855560e8467a1e766577ccf16895e6ffd9b8 /searchlib
parentca661cc6606e00bf95d2562aa41bb0134c156831 (diff)
Report nearest neighbor index memory usage as part of tensor attribute memory usage.
Diffstat (limited to 'searchlib')
-rw-r--r--searchlib/src/tests/attribute/tensorattribute/tensorattribute_test.cpp14
-rw-r--r--searchlib/src/vespa/searchlib/attribute/attributevector.h4
-rw-r--r--searchlib/src/vespa/searchlib/tensor/dense_tensor_attribute.cpp10
-rw-r--r--searchlib/src/vespa/searchlib/tensor/dense_tensor_attribute.h1
-rw-r--r--searchlib/src/vespa/searchlib/tensor/hnsw_index.cpp1
-rw-r--r--searchlib/src/vespa/searchlib/tensor/tensor_attribute.cpp14
-rw-r--r--searchlib/src/vespa/searchlib/tensor/tensor_attribute.h2
7 files changed, 41 insertions, 5 deletions
diff --git a/searchlib/src/tests/attribute/tensorattribute/tensorattribute_test.cpp b/searchlib/src/tests/attribute/tensorattribute/tensorattribute_test.cpp
index fef063fb1cf..e6eb01596a8 100644
--- a/searchlib/src/tests/attribute/tensorattribute/tensorattribute_test.cpp
+++ b/searchlib/src/tests/attribute/tensorattribute/tensorattribute_test.cpp
@@ -84,6 +84,7 @@ private:
EntryVector _removes;
generation_t _transfer_gen;
generation_t _trim_gen;
+ mutable size_t _memory_usage_cnt;
public:
MockNearestNeighborIndex(const DocVectorAccess& vectors)
@@ -91,7 +92,8 @@ public:
_adds(),
_removes(),
_transfer_gen(std::numeric_limits<generation_t>::max()),
- _trim_gen(std::numeric_limits<generation_t>::max())
+ _trim_gen(std::numeric_limits<generation_t>::max()),
+ _memory_usage_cnt(0)
{
}
void clear() {
@@ -119,6 +121,7 @@ public:
}
generation_t get_transfer_gen() const { return _transfer_gen; }
generation_t get_trim_gen() const { return _trim_gen; }
+ size_t memory_usage_cnt() const { return _memory_usage_cnt; }
void add_document(uint32_t docid) override {
auto vector = _vectors.get_vector(docid).typify<double>();
@@ -135,6 +138,7 @@ public:
_trim_gen = first_used_gen;
}
vespalib::MemoryUsage memory_usage() const override {
+ ++_memory_usage_cnt;
return vespalib::MemoryUsage();
}
std::vector<Neighbor> find_top_k(uint32_t k, vespalib::tensor::TypedCells vector, uint32_t explore_k) const override {
@@ -582,4 +586,12 @@ TEST_F("commit() ensures transfer and trim hold lists on nearest neighbor index"
EXPECT_EQUAL(gen_3, index.get_trim_gen());
}
+TEST_F("Memory usage is extracted from index when updating stats on attribute", DenseTensorAttributeMockIndex)
+{
+ size_t before = f.mock_index().memory_usage_cnt();
+ f.getStatus();
+ size_t after = f.mock_index().memory_usage_cnt();
+ EXPECT_EQUAL(before + 1, after);
+}
+
TEST_MAIN() { TEST_RUN_ALL(); vespalib::unlink("test.dat"); }
diff --git a/searchlib/src/vespa/searchlib/attribute/attributevector.h b/searchlib/src/vespa/searchlib/attribute/attributevector.h
index b5f6beaa718..a396fb70b7c 100644
--- a/searchlib/src/vespa/searchlib/attribute/attributevector.h
+++ b/searchlib/src/vespa/searchlib/attribute/attributevector.h
@@ -320,6 +320,10 @@ protected:
return _genHolder;
}
+ const GenerationHolder& getGenerationHolder() const {
+ return _genHolder;
+ }
+
template<typename T>
bool clearDoc(ChangeVectorT< ChangeTemplate<T> > &changes, DocId doc);
diff --git a/searchlib/src/vespa/searchlib/tensor/dense_tensor_attribute.cpp b/searchlib/src/vespa/searchlib/tensor/dense_tensor_attribute.cpp
index b023df19c5b..9f127018a92 100644
--- a/searchlib/src/vespa/searchlib/tensor/dense_tensor_attribute.cpp
+++ b/searchlib/src/vespa/searchlib/tensor/dense_tensor_attribute.cpp
@@ -64,6 +64,16 @@ DenseTensorAttribute::consider_remove_from_index(DocId docid)
}
}
+vespalib::MemoryUsage
+DenseTensorAttribute::memory_usage() const
+{
+ vespalib::MemoryUsage result = TensorAttribute::memory_usage();
+ if (_index) {
+ result.merge(_index->memory_usage());
+ }
+ return result;
+}
+
DenseTensorAttribute::DenseTensorAttribute(vespalib::stringref baseFileName, const Config& cfg,
const NearestNeighborIndexFactory& index_factory)
: TensorAttribute(baseFileName, cfg, _denseTensorStore),
diff --git a/searchlib/src/vespa/searchlib/tensor/dense_tensor_attribute.h b/searchlib/src/vespa/searchlib/tensor/dense_tensor_attribute.h
index 84a60376fe7..8eba8354fbd 100644
--- a/searchlib/src/vespa/searchlib/tensor/dense_tensor_attribute.h
+++ b/searchlib/src/vespa/searchlib/tensor/dense_tensor_attribute.h
@@ -24,6 +24,7 @@ private:
std::unique_ptr<NearestNeighborIndex> _index;
void consider_remove_from_index(DocId docid);
+ vespalib::MemoryUsage memory_usage() const override;
public:
DenseTensorAttribute(vespalib::stringref baseFileName, const Config& cfg,
diff --git a/searchlib/src/vespa/searchlib/tensor/hnsw_index.cpp b/searchlib/src/vespa/searchlib/tensor/hnsw_index.cpp
index 9795330b061..6d48ea1a967 100644
--- a/searchlib/src/vespa/searchlib/tensor/hnsw_index.cpp
+++ b/searchlib/src/vespa/searchlib/tensor/hnsw_index.cpp
@@ -420,6 +420,7 @@ HnswIndex::memory_usage() const
result.merge(_node_refs.getMemoryUsage());
result.merge(_nodes.getMemoryUsage());
result.merge(_links.getMemoryUsage());
+ result.merge(_visited_set_pool.memory_usage());
return result;
}
diff --git a/searchlib/src/vespa/searchlib/tensor/tensor_attribute.cpp b/searchlib/src/vespa/searchlib/tensor/tensor_attribute.cpp
index 0b9628e6872..acca4c3d8f1 100644
--- a/searchlib/src/vespa/searchlib/tensor/tensor_attribute.cpp
+++ b/searchlib/src/vespa/searchlib/tensor/tensor_attribute.cpp
@@ -111,10 +111,7 @@ TensorAttribute::onCommit()
void
TensorAttribute::onUpdateStat()
{
- // update statistics
- vespalib::MemoryUsage total = _refVector.getMemoryUsage();
- total.merge(_tensorStore.getMemoryUsage());
- total.mergeGenerationHeldBytes(getGenerationHolder().getHeldBytes());
+ vespalib::MemoryUsage total = memory_usage();
this->updateStatistics(_refVector.size(),
_refVector.size(),
total.allocatedBytes(),
@@ -178,6 +175,15 @@ TensorAttribute::setTensorRef(DocId docId, EntryRef ref)
}
}
+vespalib::MemoryUsage
+TensorAttribute::memory_usage() const
+{
+ vespalib::MemoryUsage result = _refVector.getMemoryUsage();
+ result.merge(_tensorStore.getMemoryUsage());
+ result.mergeGenerationHeldBytes(getGenerationHolder().getHeldBytes());
+ return result;
+}
+
Tensor::UP
TensorAttribute::getEmptyTensor() const
{
diff --git a/searchlib/src/vespa/searchlib/tensor/tensor_attribute.h b/searchlib/src/vespa/searchlib/tensor/tensor_attribute.h
index 64f978a31d7..5e65317baa2 100644
--- a/searchlib/src/vespa/searchlib/tensor/tensor_attribute.h
+++ b/searchlib/src/vespa/searchlib/tensor/tensor_attribute.h
@@ -27,6 +27,8 @@ protected:
void doCompactWorst();
void checkTensorType(const Tensor &tensor);
void setTensorRef(DocId docId, EntryRef ref);
+ virtual vespalib::MemoryUsage memory_usage() const;
+
public:
DECLARE_IDENTIFIABLE_ABSTRACT(TensorAttribute);
using RefCopyVector = vespalib::Array<EntryRef>;