summaryrefslogtreecommitdiffstats
path: root/searchlib
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2021-02-25 18:49:05 +0000
committerHenning Baldersheim <balder@yahoo-inc.com>2021-02-25 18:49:05 +0000
commit348cc2bf5bdba836fe1dcb0cc98a5466ba56fd8f (patch)
tree5479f4c9fde8ce0b50c364da47f5d77454ea4411 /searchlib
parentc717bb04ca9d4160b01f9769ef0cf6618d981f4d (diff)
Reserve reasonably sized buffer upfront to keep memory footprint stable
Diffstat (limited to 'searchlib')
-rw-r--r--searchlib/src/vespa/searchlib/attribute/changevector.h9
-rw-r--r--searchlib/src/vespa/searchlib/attribute/changevector.hpp22
2 files changed, 22 insertions, 9 deletions
diff --git a/searchlib/src/vespa/searchlib/attribute/changevector.h b/searchlib/src/vespa/searchlib/attribute/changevector.h
index af4a4fd6618..c3b4d0ce3b0 100644
--- a/searchlib/src/vespa/searchlib/attribute/changevector.h
+++ b/searchlib/src/vespa/searchlib/attribute/changevector.h
@@ -4,6 +4,7 @@
#include <vespa/vespalib/stllike/hash_map.h>
#include <vespa/searchcommon/common/undefinedvalues.h>
+#include <vector>
namespace vespalib { class MemoryUsage; }
@@ -141,8 +142,8 @@ protected:
template <typename T>
class ChangeVectorT : public ChangeVectorBase {
private:
- typedef vespalib::hash_map<uint32_t, uint32_t> Map;
- typedef vespalib::Array<T> Vector;
+ using Map = vespalib::hash_map<uint32_t, uint32_t>;
+ using Vector = std::vector<T>;
public:
ChangeVectorT();
~ChangeVectorT();
@@ -175,8 +176,8 @@ public:
vespalib::MemoryUsage getMemoryUsage() const;
private:
void linkIn(uint32_t doc, size_t index, size_t last);
- Vector _v;
- Map _docs;
+ Vector _v;
+ Map _docs;
uint32_t _tail;
};
diff --git a/searchlib/src/vespa/searchlib/attribute/changevector.hpp b/searchlib/src/vespa/searchlib/attribute/changevector.hpp
index da18da4e9d5..dcb31ebae73 100644
--- a/searchlib/src/vespa/searchlib/attribute/changevector.hpp
+++ b/searchlib/src/vespa/searchlib/attribute/changevector.hpp
@@ -3,16 +3,28 @@
#pragma once
#include "changevector.h"
-#include <vespa/vespalib/util/array.hpp>
#include <vespa/vespalib/util/memoryusage.h>
namespace search {
+namespace {
+
+// This number is selected to be large enough to hold bursts between commits
+constexpr size_t NUM_ELEMS_TO_RESERVE = 200;
+
+}
+
template <typename T>
-ChangeVectorT<T>::ChangeVectorT() : _tail(0) { }
-
+ChangeVectorT<T>::ChangeVectorT()
+ : _v(),
+ _docs(NUM_ELEMS_TO_RESERVE*2),
+ _tail(0)
+{
+ _v.reserve(vespalib::roundUp2inN(NUM_ELEMS_TO_RESERVE, sizeof(T)));
+}
+
template <typename T>
-ChangeVectorT<T>::~ChangeVectorT() { }
+ChangeVectorT<T>::~ChangeVectorT() = default;
template <typename T>
void
@@ -38,7 +50,7 @@ ChangeVectorT<T>::push_back(uint32_t doc, Accessor & ac)
if (ac.size() <= 0) { return; }
size_t index(size());
- _v.reserve(vespalib::roundUp2inN(index + ac.size()));
+ _v.reserve(vespalib::roundUp2inN(index + ac.size(), sizeof(T)));
for (size_t i(0), m(ac.size()); i < m; i++, ac.next()) {
_v.push_back(T(ChangeBase::APPEND, doc, typename T::DataType(ac.value()), ac.weight()));
_v.back().setNext(index + i + 1);