Skip to content

Commit 3c55dad

Browse files
committed
Add HierarchicalNSW::indexFileSize() function for precise memory footprint control
1 parent 983cea9 commit 3c55dad

File tree

2 files changed

+30
-0
lines changed

2 files changed

+30
-0
lines changed

hnswlib/hnswalg.h

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -563,6 +563,32 @@ class HierarchicalNSW : public AlgorithmInterface<dist_t> {
563563
max_elements_ = new_max_elements;
564564
}
565565

566+
size_t indexFileSize() const {
567+
size_t size = 0;
568+
size += sizeof(offsetLevel0_);
569+
size += sizeof(max_elements_);
570+
size += sizeof(cur_element_count);
571+
size += sizeof(size_data_per_element_);
572+
size += sizeof(label_offset_);
573+
size += sizeof(offsetData_);
574+
size += sizeof(maxlevel_);
575+
size += sizeof(enterpoint_node_);
576+
size += sizeof(maxM_);
577+
578+
size += sizeof(maxM0_);
579+
size += sizeof(M_);
580+
size += sizeof(mult_);
581+
size += sizeof(ef_construction_);
582+
583+
size += cur_element_count * size_data_per_element_;
584+
585+
for (size_t i = 0; i < cur_element_count; i++) {
586+
unsigned int linkListSize = element_levels_[i] > 0 ? size_links_per_element_ * element_levels_[i] : 0;
587+
size += sizeof(linkListSize);
588+
size += linkListSize;
589+
}
590+
return size;
591+
}
566592

567593
void saveIndex(const std::string &location) {
568594
std::ofstream output(location, std::ios::binary);

python_bindings/bindings.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,9 @@ class Index {
217217
this->num_threads_default = num_threads;
218218
}
219219

220+
void indexFileSize() const {
221+
appr_alg->indexFileSize();
222+
}
220223

221224
void saveIndex(const std::string &path_to_index) {
222225
appr_alg->saveIndex(path_to_index);
@@ -878,6 +881,7 @@ PYBIND11_PLUGIN(hnswlib) {
878881
.def("get_ids_list", &Index<float>::getIdsList)
879882
.def("set_ef", &Index<float>::set_ef, py::arg("ef"))
880883
.def("set_num_threads", &Index<float>::set_num_threads, py::arg("num_threads"))
884+
.def("index_file_size", &Index<float>::indexFileSize)
881885
.def("save_index", &Index<float>::saveIndex, py::arg("path_to_index"))
882886
.def("load_index", &Index<float>::loadIndex, py::arg("path_to_index"), py::arg("max_elements") = 0)
883887
.def("mark_deleted", &Index<float>::markDeleted, py::arg("label"))

0 commit comments

Comments
 (0)