MemManager.cpp 4.1 KB
Newer Older
X
Xu Peng 已提交
1 2 3 4 5
/*******************************************************************************
 * Copyright 上海赜睿信息科技有限公司(Zilliz) - All Rights Reserved
 * Unauthorized copying of this file, via any medium is strictly prohibited.
 * Proprietary and confidential.
 ******************************************************************************/
6 7 8
#ifndef MEMMANGE_CPP__
#define MEMMANGE_CPP__

9
#include <iostream>
X
Xu Peng 已提交
10 11
#include <sstream>
#include <thread>
X
Xu Peng 已提交
12
#include <easylogging++.h>
13

X
Xu Peng 已提交
14 15
#include "MemManager.h"
#include "Meta.h"
16
#include "MetaConsts.h"
17 18


X
Xu Peng 已提交
19 20 21
namespace zilliz {
namespace vecwise {
namespace engine {
22

23 24
template<typename EngineT>
MemVectors<EngineT>::MemVectors(const std::shared_ptr<meta::Meta>& meta_ptr,
25
        const meta::TableFileSchema& schema, const Options& options)
X
Xu Peng 已提交
26 27 28
  : pMeta_(meta_ptr),
    options_(options),
    schema_(schema),
29
    _pIdGenerator(new SimpleIDGenerator()),
30
    pEE_(new EngineT(schema_.dimension, schema_.location)) {
31 32
}

33 34
template<typename EngineT>
void MemVectors<EngineT>::add(size_t n_, const float* vectors_, IDNumbers& vector_ids_) {
X
Xu Peng 已提交
35
    _pIdGenerator->getNextIDNumbers(n_, vector_ids_);
X
Xu Peng 已提交
36
    pEE_->AddWithIds(n_, vectors_, vector_ids_.data());
37 38
}

39 40
template<typename EngineT>
size_t MemVectors<EngineT>::total() const {
X
Xu Peng 已提交
41
    return pEE_->Count();
42 43
}

44 45
template<typename EngineT>
size_t MemVectors<EngineT>::approximate_size() const {
X
Xu Peng 已提交
46
    return pEE_->Size();
47 48
}

49
template<typename EngineT>
50 51
Status MemVectors<EngineT>::serialize(std::string& table_id) {
    table_id = schema_.table_id;
52
    auto size = approximate_size();
X
Xu Peng 已提交
53
    pEE_->Serialize();
54 55
    schema_.size = size;
    schema_.file_type = (size >= options_.index_trigger_size) ?
56
        meta::TableFileSchema::TO_INDEX : meta::TableFileSchema::RAW;
X
Xu Peng 已提交
57 58

    auto status = pMeta_->update_group_file(schema_);
X
Xu Peng 已提交
59

60
    LOG(DEBUG) << "New " << ((schema_.file_type == meta::TableFileSchema::RAW) ? "raw" : "to_index")
61
        << " file " << schema_.file_id << " of size " << pEE_->Size() / meta::M << " M";
X
Xu Peng 已提交
62

X
Xu Peng 已提交
63
    pEE_->Cache();
X
Xu Peng 已提交
64

X
Xu Peng 已提交
65
    return status;
66 67
}

68 69
template<typename EngineT>
MemVectors<EngineT>::~MemVectors() {
70 71 72 73 74 75 76 77 78 79
    if (_pIdGenerator != nullptr) {
        delete _pIdGenerator;
        _pIdGenerator = nullptr;
    }
}

/*
 * MemManager
 */

80
template<typename EngineT>
81
typename MemManager<EngineT>::MemVectorsPtr MemManager<EngineT>::get_mem_by_group(
82 83
        const std::string& table_id) {
    auto memIt = _memMap.find(table_id);
X
Xu Peng 已提交
84 85
    if (memIt != _memMap.end()) {
        return memIt->second;
86
    }
87

88
    meta::TableFileSchema group_file;
89
    group_file.table_id = table_id;
X
Xu Peng 已提交
90
    auto status = _pMeta->add_group_file(group_file);
91 92 93
    if (!status.ok()) {
        return nullptr;
    }
X
Xu Peng 已提交
94

95 96
    _memMap[table_id] = MemVectorsPtr(new MemVectors<EngineT>(_pMeta, group_file, options_));
    return _memMap[table_id];
97 98
}

99
template<typename EngineT>
100
Status MemManager<EngineT>::add_vectors(const std::string& table_id_,
101 102 103
        size_t n_,
        const float* vectors_,
        IDNumbers& vector_ids_) {
104
    std::unique_lock<std::mutex> lock(_mutex);
105
    return add_vectors_no_lock(table_id_, n_, vectors_, vector_ids_);
106 107
}

108
template<typename EngineT>
109
Status MemManager<EngineT>::add_vectors_no_lock(const std::string& table_id,
110
        size_t n,
111
        const float* vectors,
X
Xu Peng 已提交
112
        IDNumbers& vector_ids) {
113
    MemVectorsPtr mem = get_mem_by_group(table_id);
114
    if (mem == nullptr) {
115
        return Status::NotFound("Group " + table_id + " not found!");
116
    }
X
Xu Peng 已提交
117 118 119
    mem->add(n, vectors, vector_ids);

    return Status::OK();
120 121
}

122 123
template<typename EngineT>
Status MemManager<EngineT>::mark_memory_as_immutable() {
124
    std::unique_lock<std::mutex> lock(_mutex);
X
Xu Peng 已提交
125 126 127
    for (auto& kv: _memMap) {
        _immMems.push_back(kv.second);
    }
X
Xu Peng 已提交
128

X
Xu Peng 已提交
129
    _memMap.clear();
130
    return Status::OK();
X
Xu Peng 已提交
131 132
}

133
template<typename EngineT>
134
Status MemManager<EngineT>::serialize(std::vector<std::string>& table_ids) {
X
Xu Peng 已提交
135
    mark_memory_as_immutable();
X
Xu Peng 已提交
136
    std::unique_lock<std::mutex> lock(serialization_mtx_);
137 138
    std::string table_id;
    table_ids.clear();
X
Xu Peng 已提交
139
    for (auto& mem : _immMems) {
140 141
        mem->serialize(table_id);
        table_ids.push_back(table_id);
X
Xu Peng 已提交
142 143
    }
    _immMems.clear();
144
    return Status::OK();
X
Xu Peng 已提交
145 146
}

147

X
Xu Peng 已提交
148 149 150
} // namespace engine
} // namespace vecwise
} // namespace zilliz
151 152

#endif