Go to the documentation of this file.
16 #ifndef GRAPHSCOPE_GRAPH_ID_INDEXER_H_
17 #define GRAPHSCOPE_GRAPH_ID_INDEXER_H_
23 #include <string_view>
25 #include <type_traits>
28 #include "flat_hash_map/flat_hash_map.hpp"
33 #include "glog/logging.h"
34 #include "grape/io/local_io_adaptor.h"
35 #include "grape/serialization/in_archive.h"
36 #include "grape/serialization/out_archive.h"
40 namespace id_indexer_impl {
45 inline int8_t
log2(
size_t value) {
46 static constexpr int8_t table[64] = {
47 63, 0, 58, 1, 59, 47, 53, 2, 60, 39, 48, 27, 54, 33, 42, 3,
48 61, 51, 37, 40, 49, 18, 28, 20, 55, 30, 34, 11, 43, 14, 22, 4,
49 62, 57, 46, 52, 38, 26, 32, 41, 50, 36, 17, 19, 29, 10, 13, 21,
50 56, 45, 25, 31, 35, 16, 9, 12, 44, 24, 15, 8, 23, 7, 6, 5};
57 return table[((value - (value >> 1)) * 0x07EDD5E59A4E28C2) >> 58];
62 using type = std::vector<T>;
64 template <
typename IOADAPTOR_T>
65 static void serialize(std::unique_ptr<IOADAPTOR_T>& writer,
67 size_t size = buffer.size();
68 CHECK(writer->Write(&size,
sizeof(
size_t)));
70 CHECK(writer->Write(buffer.data(), size *
sizeof(T)));
74 template <
typename IOADAPTOR_T>
77 CHECK(reader->Read(&size,
sizeof(
size_t)));
80 CHECK(reader->Read(buffer.data(), size *
sizeof(T)));
87 using type = std::vector<std::string>;
89 template <
typename IOADAPTOR_T>
90 static void serialize(std::unique_ptr<IOADAPTOR_T>& writer,
94 CHECK(writer->WriteArchive(arc));
97 template <
typename IOADAPTOR_T>
99 grape::OutArchive arc;
100 CHECK(reader->ReadArchive(arc));
109 template <
typename IOADAPTOR_T>
110 static void serialize(std::unique_ptr<IOADAPTOR_T>& writer,
111 const type& buffer) {
113 CHECK(writer->Write(&content_buffer_size,
sizeof(
size_t)));
114 if (content_buffer_size > 0) {
116 content_buffer_size *
sizeof(
char)));
119 CHECK(writer->Write(&offset_buffer_size,
sizeof(
size_t)));
120 if (offset_buffer_size > 0) {
122 offset_buffer_size *
sizeof(
size_t)));
126 template <
typename IOADAPTOR_T>
128 size_t content_buffer_size;
129 CHECK(reader->Read(&content_buffer_size,
sizeof(
size_t)));
130 if (content_buffer_size > 0) {
133 content_buffer_size *
sizeof(
char)));
135 size_t offset_buffer_size;
136 CHECK(reader->Read(&offset_buffer_size,
sizeof(
size_t)));
137 if (offset_buffer_size > 0) {
140 offset_buffer_size *
sizeof(
size_t)));
147 template <
typename T>
149 size_t operator()(
const T& val)
const {
return std::hash<T>()(val); }
155 uint64_t x =
static_cast<uint64_t
>(val);
156 x = (x ^ (x >> 30)) * UINT64_C(0xbf58476d1ce4e5b9);
157 x = (x ^ (x >> 27)) * UINT64_C(0x94d049bb133111eb);
180 template <
typename KEY_T,
typename INDEX_T>
183 template <
typename INDEX_T>
186 template <
typename KEY_T,
typename INDEX_T>
192 template <
typename INDEX_T>
208 if (
keys_ != rhs.keys_) {
209 if (
keys_ !=
nullptr) {
215 rhs.hash_policy_.get_mod_function_index());
219 if (
keys_ !=
nullptr) {
224 static std::string
prefix() {
return "indexer"; }
227 if (
keys_ !=
nullptr) {
243 LOG(WARNING) <<
"String type is a deprecated type, use varchar instead.";
244 LOG(WARNING) <<
"Use default max length"
246 <<
" for varchar type.";
250 LOG(FATAL) <<
"Not support type [" << type <<
"] as pk type ..";
256 const std::string& work_dir) {
257 keys_->
open(filename +
".keys",
"", work_dir);
258 indices_.
open(work_dir +
"/" + filename +
".indices",
true);
262 dump_meta(work_dir +
"/" + filename +
".meta");
283 for (
size_t k = 0; k !=
size; ++k) {
284 indices_[k] = std::numeric_limits<INDEX_T>::max();
287 for (INDEX_T idx = 0; idx < num_elements; ++idx) {
291 static constexpr INDEX_T sentinel = std::numeric_limits<INDEX_T>::max();
309 INDEX_T ind =
static_cast<INDEX_T
>(
num_elements_.fetch_add(1));
313 static constexpr INDEX_T sentinel = std::numeric_limits<INDEX_T>::max();
315 if (__sync_bool_compare_and_swap(&
indices_.
data()[index], sentinel,
328 static constexpr INDEX_T sentinel = std::numeric_limits<INDEX_T>::max();
331 if (ind == sentinel) {
332 VLOG(10) <<
"cannot find " << oid.
to_string() <<
" in lf_indexer";
334 }
else if (
keys_->
get(ind) == oid) {
348 static constexpr INDEX_T sentinel = std::numeric_limits<INDEX_T>::max();
351 if (ind == sentinel) {
353 }
else if (
keys_->
get(ind) == oid) {
365 void copy_to_tmp(
const std::string& cur_path,
const std::string& tmp_path) {
366 copy_file(cur_path +
".meta", tmp_path +
".meta");
369 copy_file(cur_path +
".indices", tmp_path +
".indices");
373 const std::string& work_dir) {
374 if (std::filesystem::exists(
snapshot_dir +
"/" + name +
".meta")) {
380 load_meta(work_dir +
"/" + name +
".meta");
381 keys_->
open(name +
".keys",
"", work_dir);
382 indices_.
open(work_dir +
"/" + name +
".indices",
true);
391 if (std::filesystem::exists(name +
".meta")) {
404 if (std::filesystem::exists(name +
".meta")) {
410 if (hugepage_table) {
434 grape::InArchive arc;
437 FILE* fout = fopen(filename.c_str(),
"wb");
438 fwrite(arc.GetBuffer(),
sizeof(
char), arc.GetSize(), fout);
444 grape::OutArchive arc;
445 FILE* fin = fopen(filename.c_str(),
"r");
446 size_t meta_file_size = std::filesystem::file_size(filename);
447 std::vector<char> buf(meta_file_size);
448 CHECK_EQ(fread(buf.data(),
sizeof(
char), meta_file_size, fin),
450 arc.SetSlice(buf.data(), meta_file_size);
451 size_t mod_function_index;
460 hash_policy_.set_mod_function_by_index(mod_function_index);
469 std::atomic<size_t> k_i(0), i_i(0);
470 std::atomic<size_t> output(0);
472 std::vector<std::thread> threads;
473 for (
int i = 0; i < thread_num; ++i) {
474 threads.emplace_back([&]() {
477 size_t begin = std::min(k_i.fetch_add(chunk), keys_size);
478 size_t end = std::min(begin + chunk, keys_size);
482 while (begin < end) {
488 size_t begin = std::min(i_i.fetch_add(chunk), indices_size);
489 size_t end = std::min(begin + chunk, indices_size);
493 while (begin < end) {
498 output.fetch_add(ret);
501 for (
auto& thrd : threads) {
504 (void) output.load();
519 template <
typename _KEY_T,
typename _INDEX_T>
521 const std::string& filename,
527 template <
typename INDEX_T>
533 virtual void _add(
const Any& oid) = 0;
534 virtual bool add(
const Any& oid, INDEX_T& lid) = 0;
535 virtual bool get_key(
const INDEX_T& lid,
Any& oid)
const = 0;
536 virtual bool get_index(
const Any& oid, INDEX_T& lid)
const = 0;
537 virtual size_t size()
const = 0;
540 template <
typename KEY_T,
typename INDEX_T>
559 bool add(
const Any& oid, INDEX_T& lid)
override {
563 return add(oid_, lid);
568 bool flag =
get_key(lid, oid_);
592 bool add(
const KEY_T& oid, INDEX_T& lid) {
596 int8_t distance_from_desired = 0;
597 for (;
distances_[index] >= distance_from_desired;
598 ++index, ++distance_from_desired) {
600 if (
keys_[cur_lid] == oid) {
606 lid =
static_cast<INDEX_T
>(
keys_.size());
607 keys_.push_back(oid);
614 bool add(KEY_T&& oid, INDEX_T& lid) {
618 int8_t distance_from_desired = 0;
619 for (;
distances_[index] >= distance_from_desired;
620 ++index, ++distance_from_desired) {
622 if (
keys_[cur_lid] == oid) {
628 lid =
static_cast<INDEX_T
>(
keys_.size());
629 keys_.push_back(std::move(oid));
640 int8_t distance_from_desired = 0;
641 for (;
distances_[index] >= distance_from_desired;
642 ++index, ++distance_from_desired) {
644 if (
keys_[cur_lid] == oid) {
650 lid =
static_cast<INDEX_T
>(
keys_.size());
651 keys_.push_back(oid);
662 int8_t distance_from_desired = 0;
663 for (;
distances_[index] >= distance_from_desired;
664 ++index, ++distance_from_desired) {
666 if (
keys_[cur_lid] == oid) {
672 lid =
static_cast<INDEX_T
>(
keys_.size());
673 keys_.push_back(std::move(oid));
684 int8_t distance_from_desired = 0;
685 for (;
distances_[index] >= distance_from_desired;
686 ++index, ++distance_from_desired) {
692 INDEX_T lid =
static_cast<INDEX_T
>(
keys_.size());
693 keys_.push_back(oid);
703 int8_t distance_from_desired = 0;
704 for (;
distances_[index] >= distance_from_desired;
705 ++index, ++distance_from_desired) {
711 INDEX_T lid =
static_cast<INDEX_T
>(
keys_.size());
712 keys_.push_back(std::move(oid));
737 for (int8_t distance = 0;
distances_[index] >= distance;
738 ++distance, ++index) {
740 if (
keys_[ret] == oid) {
748 bool _get_index(
const KEY_T& oid,
size_t hash, INDEX_T& lid)
const {
750 for (int8_t distance = 0;
distances_[index] >= distance;
751 ++distance, ++index) {
753 if (
keys_[ret] == oid) {
778 void Serialize(std::unique_ptr<grape::LocalIOAdaptor>& writer)
const {
780 grape::InArchive arc;
784 CHECK(writer->WriteArchive(arc));
788 CHECK(writer->Write(
const_cast<uint8_t*
>(
indices_.data()),
789 indices_.size() *
sizeof(INDEX_T)));
792 CHECK(writer->Write(
const_cast<int8_t*
>(
distances_.data()),
797 void Deserialize(std::unique_ptr<grape::LocalIOAdaptor>& reader) {
799 grape::OutArchive arc;
800 CHECK(reader->ReadArchive(arc));
801 size_t mod_function_index;
802 size_t indices_size, distances_size;
807 hash_policy_.set_mod_function_by_index(mod_function_index);
810 if (indices_size > 0) {
813 if (distances_size > 0) {
823 KEY_T key =
keys_[lid];
826 int8_t distance_from_desired = 0;
827 for (;
distances_[index] >= distance_from_desired;
828 ++index, ++distance_from_desired) {
850 INDEX_T to_insert = lid;
851 std::swap(distance_from_desired,
distances_[index]);
852 std::swap(to_insert,
indices_[index]);
853 for (++distance_from_desired, ++index;; ++index) {
859 }
else if (
distances_[index] < distance_from_desired) {
860 std::swap(distance_from_desired,
distances_[index]);
861 std::swap(to_insert,
indices_[index]);
862 ++distance_from_desired;
864 ++distance_from_desired;
876 num_buckets = std::max(
877 num_buckets,
static_cast<size_t>(std::ceil(
880 if (num_buckets == 0) {
885 auto new_prime_index =
hash_policy_.next_size_over(num_buckets);
894 std::numeric_limits<INDEX_T>::max());
896 size_t special_end_index = num_buckets + new_max_lookups - 1;
897 for (
size_t i = 0; i != special_end_index; ++i) {
898 new_distances[i] = -1;
900 new_distances[special_end_index] = 0;
912 INDEX_T elem_num =
static_cast<INDEX_T
>(
keys_.size());
913 for (INDEX_T lid = 0; lid < elem_num; ++lid) {
924 std::numeric_limits<INDEX_T>::max());
950 template <
typename _KEY_T,
typename _INDEX_T>
952 const std::string& filename,
958 template <
typename KEY_T,
typename INDEX_T>
963 for (
size_t idx = 0; idx < size; ++idx) {
969 template <
typename INDEX_T>
975 for (
size_t idx = 0; idx < size; ++idx) {
981 template <
typename KEY_T,
typename INDEX_T>
986 size_t size = input.
keys_.size();
988 lf.
keys_->
open(filename +
".keys",
"", work_dir);
1003 static constexpr INDEX_T sentinel = std::numeric_limits<INDEX_T>::max();
1005 std::vector<INDEX_T> residuals;
1007 if (input.
indices_[idx] != sentinel) {
1008 residuals.push_back(input.
indices_[idx]);
1011 for (
const auto& lid : residuals) {
1012 auto oid = input.
keys_[lid];
1018 }
else if (lf.
indices_[index] == sentinel) {
1028 std::filesystem::remove(work_dir +
"/" + filename +
".meta");
1035 #endif // GRAPHSCOPE_GRAPH_ID_INDEXER_H_
dist_buffer_t distances_
Definition: id_indexer.h:941
ind_buffer_t indices_
Definition: id_indexer.h:940
typename id_indexer_impl::KeyBuffer< std::string_view >::type key_buffer_t
Definition: id_indexer.h:972
void rehash(size_t num_buckets)
Definition: id_indexer.h:875
void open_with_hugepages(const std::string &name, bool hugepage_table)
Definition: id_indexer.h:403
size_t operator()(const T &val) const
Definition: id_indexer.h:149
size_t num_elements_
Definition: id_indexer.h:945
void _add(KEY_T &&oid)
Definition: id_indexer.h:699
uint64_t AsUInt64() const
Definition: types.h:611
void build_lf_indexer(const IdIndexer< KEY_T, INDEX_T > &input, const std::string &filename, LFIndexer< INDEX_T > &lf, const std::string &snapshot_dir, const std::string &work_dir, PropertyType type)
Definition: id_indexer.h:982
void emplace(INDEX_T lid)
Definition: id_indexer.h:822
size_t bucket_count() const
Definition: id_indexer.h:718
virtual void open(const std::string &name, const std::string &snapshot_dir, const std::string &work_dir)=0
void open(const std::string &name, const std::string &snapshot_dir, const std::string &work_dir)
Definition: id_indexer.h:372
std::atomic< size_t > num_elements_
Definition: id_indexer.h:512
static void deserialize(std::unique_ptr< IOADAPTOR_T > &reader, type &buffer)
Definition: id_indexer.h:98
Definition: id_indexer.h:148
std::vector< KEY_T > type
Definition: id_indexer.h:62
std::vector< std::string > type
Definition: id_indexer.h:87
static int8_t compute_max_lookups(size_t num_buckets)
Definition: id_indexer.h:934
friend void build_lf_indexer(const IdIndexer< _KEY_T, _INDEX_T > &input, const std::string &filename, LFIndexer< _INDEX_T > &output, const std::string &snapshot_dir, const std::string &work_dir, PropertyType type)
void swap(IdIndexer< KEY_T, INDEX_T > &rhs)
Definition: id_indexer.h:761
void set_value(size_t index, const T &val)
Definition: column.h:186
virtual PropertyType type() const =0
bool _add(KEY_T &&oid, size_t hash_value, INDEX_T &lid)
Definition: id_indexer.h:658
~IdIndexer()
Definition: id_indexer.h:548
typename id_indexer_impl::KeyBuffer< std::string >::type key_buffer_t
Definition: id_indexer.h:543
static Any From(const T &value)
Definition: types.h:681
ska::ska::prime_number_hash_policy hash_policy_
Definition: id_indexer.h:943
size_t operator()(const int64_t &val) const
Definition: id_indexer.h:154
INDEX_T get_index(const Any &oid) const
Definition: id_indexer.h:324
size_t entry_num() const
Definition: id_indexer.h:590
const T & get(size_t idx) const
Definition: mmap_array.h:410
void copy_to_tmp(const std::string &cur_path, const std::string &tmp_path)
Definition: id_indexer.h:365
LFIndexer(LFIndexer &&rhs)
Definition: id_indexer.h:202
static std::string prefix()
Definition: id_indexer.h:224
const ColumnBase & get_keys() const
Definition: id_indexer.h:465
void _rehash(size_t num)
Definition: id_indexer.h:819
void resize(size_t size)
Definition: mmap_array.h:319
void Serialize(std::unique_ptr< grape::LocalIOAdaptor > &writer) const
Definition: id_indexer.h:778
Definition: id_indexer.h:528
void dump_meta(const std::string &filename) const
Definition: id_indexer.h:433
virtual size_t size() const =0
Definition: id_indexer.h:153
virtual PropertyType get_type() const =0
void _add(const Any &oid) override
Definition: id_indexer.h:552
GHash< KEY_T > hasher_
Definition: id_indexer.h:948
static void to(const Any &value, T &out)
Definition: types.h:799
static constexpr int8_t min_lookups
Definition: id_indexer.h:42
Definition: adj_list.h:23
key_buffer_t & keys()
Definition: id_indexer.h:776
Definition: string_view_vector.h:27
INDEX_T insert(const Any &oid)
Definition: id_indexer.h:307
bool _get_index(const KEY_T &oid, size_t hash, INDEX_T &lid) const
Definition: id_indexer.h:748
void Deserialize(std::unique_ptr< grape::LocalIOAdaptor > &reader)
Definition: id_indexer.h:797
static const PropertyType kUInt64
Definition: types.h:141
key_buffer_t keys_
Definition: id_indexer.h:939
void grow()
Definition: id_indexer.h:873
int32_t AsInt32() const
Definition: types.h:616
int64_t AsInt64() const
Definition: types.h:606
impl::PropertyTypeImpl type_enum
Definition: types.h:97
bool get_index(const KEY_T &oid, INDEX_T &lid) const
Definition: id_indexer.h:734
void Clear()
Definition: id_indexer.h:581
ska::ska::prime_number_hash_policy hash_policy_
Definition: id_indexer.h:516
Definition: id_indexer.h:61
static void serialize(std::unique_ptr< IOADAPTOR_T > &writer, const type &buffer)
Definition: id_indexer.h:65
size_t size() const override
Definition: id_indexer.h:724
uint32_t AsUInt32() const
Definition: types.h:621
void open(const std::string &filename, bool sync_to_file=false)
Definition: mmap_array.h:129
virtual ~IdIndexerBase()=default
static void deserialize(std::unique_ptr< IOADAPTOR_T > &reader, type &buffer)
Definition: id_indexer.h:127
static constexpr const uint16_t STRING_DEFAULT_MAX_LENGTH
Definition: types.h:96
static void deserialize(std::unique_ptr< IOADAPTOR_T > &reader, type &buffer)
Definition: id_indexer.h:75
void set_value(size_t idx, const std::string_view &val)
Definition: column.h:501
void reset_to_empty_state()
Definition: id_indexer.h:918
void init(const PropertyType &type)
Definition: id_indexer.h:226
T * data()
Definition: mmap_array.h:405
void build_empty_LFIndexer(const std::string &filename, const std::string &snapshot_dir, const std::string &work_dir)
Definition: id_indexer.h:254
GHash< Any > hasher_
Definition: id_indexer.h:517
size_t operator()(const Any &val) const
Definition: id_indexer.h:165
size_t size() const
Definition: mmap_array.h:415
static const PropertyType kUInt32
Definition: types.h:138
void operator()(const key_buffer_t &input, ColumnBase &col, size_t size)
Definition: id_indexer.h:973
Definition: id_indexer.h:164
void close()
Definition: id_indexer.h:428
bool add(const KEY_T &oid, INDEX_T &lid)
Definition: id_indexer.h:592
virtual void copy_to_tmp(const std::string &cur_path, const std::string &tmp_path)=0
virtual bool get_index(const Any &oid, INDEX_T &lid) const =0
size_t capacity() const
Definition: id_indexer.h:302
bool _add(const KEY_T &oid, size_t hash_value, INDEX_T &lid)
Definition: id_indexer.h:636
virtual void set_any(size_t index, const Any &value)=0
bool get_index(const Any &oid, INDEX_T &ret) const
Definition: id_indexer.h:342
std::vector< char > & content_buffer()
Definition: string_view_vector.h:57
void load_meta(const std::string &filename)
Definition: id_indexer.h:443
Definition: id_indexer.h:959
virtual void _add(const Any &oid)=0
Definition: id_indexer.h:181
std::vector< int8_t > dist_buffer_t
Definition: id_indexer.h:545
PropertyType get_type() const override
Definition: id_indexer.h:550
virtual void dump(const std::string &filename)=0
virtual bool get_key(const INDEX_T &lid, Any &oid) const =0
virtual bool add(const Any &oid, INDEX_T &lid)=0
void emplace_new_value(int8_t distance_from_desired, size_t index, INDEX_T lid)
Definition: id_indexer.h:837
virtual Any get(size_t index) const =0
void dump(const std::string &filename)
Definition: mmap_array.h:259
bool empty() const
Definition: id_indexer.h:722
int8_t max_lookups_
Definition: id_indexer.h:944
virtual size_t size() const =0
void operator()(const key_buffer_t &input, ColumnBase &col, size_t size)
Definition: id_indexer.h:961
virtual void open_in_memory(const std::string &name)=0
static const PropertyType kInt64
Definition: types.h:140
void copy_file(const std::string &src, const std::string &dst)
Definition: file_names.h:80
static void serialize(std::unique_ptr< IOADAPTOR_T > &writer, const type &buffer)
Definition: id_indexer.h:110
PropertyType get_type() const
Definition: id_indexer.h:305
std::vector< size_t > & offset_buffer()
Definition: string_view_vector.h:61
bool add(const Any &oid, INDEX_T &lid) override
Definition: id_indexer.h:559
ColumnBase * keys_
Definition: id_indexer.h:514
static void serialize(std::unique_ptr< IOADAPTOR_T > &writer, const type &buffer)
Definition: id_indexer.h:90
bool get_key(const INDEX_T &lid, Any &oid) const override
Definition: id_indexer.h:566
std::string snapshot_dir(const std::string &work_dir, uint32_t version)
Definition: file_names.h:192
Definition: loading_config.h:232
void dump(const std::string &name, const std::string &snapshot_dir)
Definition: id_indexer.h:420
size_t num_slots_minus_one_
Definition: id_indexer.h:946
virtual void open_with_hugepages(const std::string &name, bool force)=0
void _add(const KEY_T &oid)
Definition: id_indexer.h:680
std::size_t hash_value(const grape::EmptyType &value)
Definition: types.h:1318
bool get_key(INDEX_T lid, KEY_T &oid) const
Definition: id_indexer.h:726
bool add(KEY_T &&oid, INDEX_T &lid)
Definition: id_indexer.h:614
IdIndexer()
Definition: id_indexer.h:547
PropertyType type
Definition: types.h:793
bool get_index(const Any &oid, INDEX_T &lid) const override
Definition: id_indexer.h:575
void open_with_hugepages(const std::string &filename, size_t capacity=0)
Definition: mmap_array.h:214
LFIndexer()
Definition: id_indexer.h:195
friend void build_lf_indexer(const IdIndexer< _KEY_T, _INDEX_T > &input, const std::string &filename, LFIndexer< _INDEX_T > &output, const std::string &snapshot_dir, const std::string &work_dir, PropertyType type)
Any get_key(const INDEX_T &index) const
Definition: id_indexer.h:363
impl::AdditionalTypeInfo additional_type_info
Definition: types.h:98
typename id_indexer_impl::KeyBuffer< KEY_T >::type key_buffer_t
Definition: id_indexer.h:960
size_t size() const
Definition: id_indexer.h:304
uint16_t max_length
Definition: types.h:91
TypedColumn< std::string_view > StringColumn
Definition: column.h:576
virtual void resize(size_t size)=0
void reset()
Definition: mmap_array.h:84
std::string to_string() const
Definition: types.h:560
Definition: id_indexer.h:184
~LFIndexer()
Definition: id_indexer.h:218
int8_t log2(size_t value)
Definition: id_indexer.h:45
static const PropertyType kInt32
Definition: types.h:137
void rehash(size_t size)
Definition: id_indexer.h:269
std::string_view AsStringView() const
Definition: types.h:641
static constexpr double max_load_factor
Definition: id_indexer.h:43
std::vector< int > ind_buffer_t
Definition: id_indexer.h:544
size_t num_slots_minus_one_
Definition: id_indexer.h:513
size_t indices_size_
Definition: id_indexer.h:511
mmap_array< INDEX_T > indices_
Definition: id_indexer.h:509
void reserve(size_t size)
Definition: id_indexer.h:267
const key_buffer_t & keys() const
Definition: id_indexer.h:774
void open_in_memory(const std::string &name)
Definition: id_indexer.h:390
void warmup(int thread_num) const
Definition: id_indexer.h:466