@@ -100,8 +100,12 @@ BasicSearcher::search_impl(const GraphInterfacePtr& graph,
100100 const float * query,
101101 const InnerSearchParam& inner_search_param,
102102 IteratorFilterContext* iter_ctx) const {
103- MaxHeap top_candidates (allocator_);
104- MaxHeap candidate_set (allocator_);
103+ vsag::Vector<std::pair<float , InnerIdType>> top_candidates_buffer (inner_search_param.search_alloc );
104+ top_candidates_buffer.reserve (inner_search_param.ef * 2 );
105+ MaxHeap top_candidates (CompareByFirst (), top_candidates_buffer);
106+ vsag::Vector<std::pair<float , InnerIdType>> candidate_set_buffer (inner_search_param.search_alloc );
107+ candidate_set_buffer.reserve (inner_search_param.ef * 2 );
108+ MaxHeap candidate_set (CompareByFirst (), candidate_set_buffer);
105109
106110 if (not graph or not flatten) {
107111 return top_candidates;
@@ -120,10 +124,10 @@ BasicSearcher::search_impl(const GraphInterfacePtr& graph,
120124 uint32_t hops = 0 ;
121125 uint32_t dist_cmp = 0 ;
122126 uint32_t count_no_visited = 0 ;
123- Vector<InnerIdType> to_be_visited_rid (graph->MaximumDegree (), allocator_ );
124- Vector<InnerIdType> to_be_visited_id (graph->MaximumDegree (), allocator_ );
125- Vector<InnerIdType> neighbors (graph->MaximumDegree (), allocator_ );
126- Vector<float > line_dists (graph->MaximumDegree (), allocator_ );
127+ Vector<InnerIdType> to_be_visited_rid (graph->MaximumDegree (), inner_search_param. search_alloc );
128+ Vector<InnerIdType> to_be_visited_id (graph->MaximumDegree (), inner_search_param. search_alloc );
129+ Vector<InnerIdType> neighbors (graph->MaximumDegree (), inner_search_param. search_alloc );
130+ Vector<float > line_dists (graph->MaximumDegree (), inner_search_param. search_alloc );
127131
128132 if (!iter_ctx->IsFirstUsed ()) {
129133 if (iter_ctx->Empty ()) {
@@ -135,7 +139,7 @@ BasicSearcher::search_impl(const GraphInterfacePtr& graph,
135139 if (!vl->Get (cur_inner_id) && iter_ctx->CheckPoint (cur_inner_id)) {
136140 vl->Set (cur_inner_id);
137141 lower_bound = std::max (lower_bound, cur_dist);
138- flatten->Query (&cur_dist, computer, &cur_inner_id, 1 );
142+ flatten->Query (&cur_dist, computer, &cur_inner_id, 1 , inner_search_param. search_alloc );
139143 top_candidates.emplace (cur_dist, cur_inner_id);
140144 candidate_set.emplace (cur_dist, cur_inner_id);
141145 if constexpr (mode == InnerSearchMode::RANGE_SEARCH) {
@@ -147,7 +151,7 @@ BasicSearcher::search_impl(const GraphInterfacePtr& graph,
147151 iter_ctx->PopDiscard ();
148152 }
149153 } else {
150- flatten->Query (&dist, computer, &ep, 1 );
154+ flatten->Query (&dist, computer, &ep, 1 , inner_search_param. search_alloc );
151155 if (not is_id_allowed || is_id_allowed->CheckValid (ep)) {
152156 top_candidates.emplace (dist, ep);
153157 lower_bound = top_candidates.top ().first ;
@@ -182,7 +186,7 @@ BasicSearcher::search_impl(const GraphInterfacePtr& graph,
182186
183187 dist_cmp += count_no_visited;
184188
185- flatten->Query (line_dists.data (), computer, to_be_visited_id.data (), count_no_visited);
189+ flatten->Query (line_dists.data (), computer, to_be_visited_id.data (), count_no_visited, inner_search_param. search_alloc );
186190
187191 for (uint32_t i = 0 ; i < count_no_visited; i++) {
188192 dist = line_dists[i];
@@ -234,8 +238,12 @@ BasicSearcher::search_impl(const GraphInterfacePtr& graph,
234238 const VisitedListPtr& vl,
235239 const float * query,
236240 const InnerSearchParam& inner_search_param) const {
237- MaxHeap top_candidates (allocator_);
238- MaxHeap candidate_set (allocator_);
241+ vsag::Vector<std::pair<float , InnerIdType>> top_candidates_buffer (inner_search_param.search_alloc );
242+ top_candidates_buffer.reserve (inner_search_param.ef * 2 );
243+ MaxHeap top_candidates (CompareByFirst (), top_candidates_buffer);
244+ vsag::Vector<std::pair<float , InnerIdType>> candidate_set_buffer (inner_search_param.search_alloc );
245+ candidate_set_buffer.reserve (inner_search_param.ef * 2 );
246+ MaxHeap candidate_set (CompareByFirst (), candidate_set_buffer);
239247
240248 if (not graph or not flatten) {
241249 return top_candidates;
@@ -253,12 +261,12 @@ BasicSearcher::search_impl(const GraphInterfacePtr& graph,
253261 uint32_t hops = 0 ;
254262 uint32_t dist_cmp = 0 ;
255263 uint32_t count_no_visited = 0 ;
256- Vector<InnerIdType> to_be_visited_rid (graph->MaximumDegree (), allocator_ );
257- Vector<InnerIdType> to_be_visited_id (graph->MaximumDegree (), allocator_ );
258- Vector<InnerIdType> neighbors (graph->MaximumDegree (), allocator_ );
259- Vector<float > line_dists (graph->MaximumDegree (), allocator_ );
264+ Vector<InnerIdType> to_be_visited_rid (graph->MaximumDegree (), inner_search_param. search_alloc );
265+ Vector<InnerIdType> to_be_visited_id (graph->MaximumDegree (), inner_search_param. search_alloc );
266+ Vector<InnerIdType> neighbors (graph->MaximumDegree (), inner_search_param. search_alloc );
267+ Vector<float > line_dists (graph->MaximumDegree (), inner_search_param. search_alloc );
260268
261- flatten->Query (&dist, computer, &ep, 1 );
269+ flatten->Query (&dist, computer, &ep, 1 , inner_search_param. search_alloc );
262270 if (not is_id_allowed || is_id_allowed->CheckValid (ep)) {
263271 top_candidates.emplace (dist, ep);
264272 lower_bound = top_candidates.top ().first ;
@@ -297,7 +305,7 @@ BasicSearcher::search_impl(const GraphInterfacePtr& graph,
297305
298306 dist_cmp += count_no_visited;
299307
300- flatten->Query (line_dists.data (), computer, to_be_visited_id.data (), count_no_visited);
308+ flatten->Query (line_dists.data (), computer, to_be_visited_id.data (), count_no_visited, inner_search_param. search_alloc );
301309
302310 for (uint32_t i = 0 ; i < count_no_visited; i++) {
303311 dist = line_dists[i];
0 commit comments