|
17 | 17 | #define GRAPE_GRAPH_PERFECT_HASH_INDEXER_H_
|
18 | 18 |
|
19 | 19 | #include "grape/graph/hashmap_indexer_impl.h"
|
| 20 | +#include "grape/util.h" |
20 | 21 | #include "grape/utils/pthash_utils/single_phf_view.h"
|
| 22 | +#include "grape/utils/string_view_vector.h" |
21 | 23 |
|
22 | 24 | namespace grape {
|
23 | 25 |
|
@@ -69,6 +71,10 @@ class ImmPHIdxer {
|
69 | 71 | idxer_.init(buffer_.data(), buffer_.size());
|
70 | 72 | }
|
71 | 73 |
|
| 74 | + void Init(const char *buf, size_t size) { |
| 75 | + idxer_.init(buf, size); |
| 76 | + } |
| 77 | + |
72 | 78 | size_t entry_num() const { return idxer_.entry_num(); }
|
73 | 79 |
|
74 | 80 | bool empty() const { return idxer_.empty(); }
|
@@ -119,33 +125,34 @@ class PHIdxerViewBuilder {
|
119 | 125 |
|
120 | 126 | void add(KEY_T&& oid) { keys_.push_back(std::move(oid)); }
|
121 | 127 |
|
122 |
| - ImmPHIdxer<KEY_T, INDEX_T> finish() { |
123 |
| - mem_dumper dumper; |
124 |
| - { |
125 |
| - SinglePHFView<murmurhasher>::build(keys_.begin(), keys_.size(), dumper, |
126 |
| - 1); |
127 |
| - mem_loader loader(dumper.buffer().data(), dumper.buffer().size()); |
128 |
| - SinglePHFView<murmurhasher> phf; |
129 |
| - phf.load(loader); |
130 |
| - hashmap_indexer_impl::KeyBuffer<KEY_T> key_buffer; |
131 |
| - |
132 |
| - std::vector<KEY_T> ordered_keys(keys_.size()); |
133 |
| - for (auto& key : keys_) { |
134 |
| - size_t idx = phf(key); |
135 |
| - ordered_keys[idx] = key; |
136 |
| - } |
137 |
| - for (auto& key : ordered_keys) { |
138 |
| - key_buffer.push_back(key); |
139 |
| - } |
140 |
| - key_buffer.dump(dumper); |
| 128 | + void buildPhf() { |
| 129 | + SinglePHFView<murmurhasher>::build(keys_.begin(), |
| 130 | + keys_.size(), phf, 1); |
| 131 | + std::vector<KEY_T> ordered_keys(keys_.size()); |
| 132 | + for (auto& key : keys_) { |
| 133 | + size_t idx = phf(key); |
| 134 | + ordered_keys[idx] = key; |
141 | 135 | }
|
142 |
| - ImmPHIdxer<KEY_T, INDEX_T> idxer; |
143 |
| - idxer.Init(std::move(dumper.buffer())); |
144 |
| - return idxer; |
| 136 | + for (auto& key : ordered_keys) { |
| 137 | + key_buffer.push_back(key); |
| 138 | + } |
| 139 | + } |
| 140 | + |
| 141 | + void finish(void *buffer, size_t size, ImmPHIdxer<KEY_T, INDEX_T> &idxer) { |
| 142 | + external_mem_dumper dumper(buffer, size); |
| 143 | + phf.dump(dumper); |
| 144 | + key_buffer.dump(dumper); |
| 145 | + idxer.Init(static_cast<const char*>(dumper.buffer()), dumper.size()); |
| 146 | + } |
| 147 | + |
| 148 | + size_t getSerializeSize() { |
| 149 | + return phf.num_bits() / 8 + key_buffer.dump_size(); |
145 | 150 | }
|
146 | 151 |
|
147 | 152 | private:
|
148 | 153 | std::vector<KEY_T> keys_;
|
| 154 | + hashmap_indexer_impl::KeyBuffer<KEY_T> key_buffer; |
| 155 | + pthash::single_phf<murmurhasher, pthash::dictionary_dictionary, true> phf; |
149 | 156 | };
|
150 | 157 |
|
151 | 158 | } // namespace grape
|
|
0 commit comments