diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2021-02-25 18:49:05 +0000 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2021-02-25 18:49:05 +0000 |
commit | 348cc2bf5bdba836fe1dcb0cc98a5466ba56fd8f (patch) | |
tree | 5479f4c9fde8ce0b50c364da47f5d77454ea4411 /searchlib | |
parent | c717bb04ca9d4160b01f9769ef0cf6618d981f4d (diff) |
Reserve reasonably sized buffer upfront to keep memory footprint stable
Diffstat (limited to 'searchlib')
-rw-r--r-- | searchlib/src/vespa/searchlib/attribute/changevector.h | 9 | ||||
-rw-r--r-- | searchlib/src/vespa/searchlib/attribute/changevector.hpp | 22 |
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); |