MemManager.cpp 4.4 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.
 ******************************************************************************/
X
Xu Peng 已提交
6 7
#include "MemManager.h"
#include "Meta.h"
8
#include "MetaConsts.h"
G
groot 已提交
9
#include "EngineFactory.h"
Y
yu yunfeng 已提交
10
#include "metrics/Metrics.h"
11

12 13 14 15
#include <iostream>
#include <sstream>
#include <thread>
#include <easylogging++.h>
16

X
Xu Peng 已提交
17
namespace zilliz {
J
jinhai 已提交
18
namespace milvus {
X
Xu Peng 已提交
19
namespace engine {
20

G
groot 已提交
21
MemVectors::MemVectors(const std::shared_ptr<meta::Meta>& meta_ptr,
22
        const meta::TableFileSchema& schema, const Options& options)
X
Xu Peng 已提交
23 24 25
  : pMeta_(meta_ptr),
    options_(options),
    schema_(schema),
X
Xu Peng 已提交
26
    pIdGenerator_(new SimpleIDGenerator()),
G
groot 已提交
27
    pEE_(EngineFactory::Build(schema_.dimension_, schema_.location_, (EngineType)schema_.engine_type_)) {
28 29
}

Y
yu yunfeng 已提交
30

G
groot 已提交
31
void MemVectors::Add(size_t n_, const float* vectors_, IDNumbers& vector_ids_) {
Y
yu yunfeng 已提交
32
    auto start_time = METRICS_NOW_TIME;
X
Xu Peng 已提交
33
    pIdGenerator_->GetNextIDNumbers(n_, vector_ids_);
X
Xu Peng 已提交
34
    pEE_->AddWithIds(n_, vectors_, vector_ids_.data());
Y
yu yunfeng 已提交
35 36
    auto end_time = METRICS_NOW_TIME;
    auto total_time = METRICS_MICROSECONDS(start_time, end_time);
Y
yu yunfeng 已提交
37
    server::Metrics::GetInstance().AddVectorsPerSecondGaugeSet(static_cast<int>(n_), static_cast<int>(schema_.dimension_), total_time);
38 39
}

G
groot 已提交
40
size_t MemVectors::Total() const {
X
Xu Peng 已提交
41
    return pEE_->Count();
42 43
}

G
groot 已提交
44
size_t MemVectors::ApproximateSize() const {
X
Xu Peng 已提交
45
    return pEE_->Size();
46 47
}

G
groot 已提交
48
Status MemVectors::Serialize(std::string& table_id) {
G
groot 已提交
49
    table_id = schema_.table_id_;
X
Xu Peng 已提交
50
    auto size = ApproximateSize();
Y
yu yunfeng 已提交
51
    auto start_time = METRICS_NOW_TIME;
X
Xu Peng 已提交
52
    pEE_->Serialize();
Y
yu yunfeng 已提交
53 54
    auto end_time = METRICS_NOW_TIME;
    auto total_time = METRICS_MICROSECONDS(start_time, end_time);
G
groot 已提交
55
    schema_.size_ = size;
Y
yu yunfeng 已提交
56 57 58

    server::Metrics::GetInstance().DiskStoreIOSpeedGaugeSet(size/total_time);

G
groot 已提交
59
    schema_.file_type_ = (size >= options_.index_trigger_size) ?
60
        meta::TableFileSchema::TO_INDEX : meta::TableFileSchema::RAW;
X
Xu Peng 已提交
61

X
Xu Peng 已提交
62
    auto status = pMeta_->UpdateTableFile(schema_);
X
Xu Peng 已提交
63

G
groot 已提交
64
    LOG(DEBUG) << "New " << ((schema_.file_type_ == meta::TableFileSchema::RAW) ? "raw" : "to_index")
G
groot 已提交
65
        << " file " << schema_.file_id_ << " of size " << (double)(pEE_->Size()) / (double)meta::M << " M";
X
Xu Peng 已提交
66

X
Xu Peng 已提交
67
    pEE_->Cache();
X
Xu Peng 已提交
68

X
Xu Peng 已提交
69
    return status;
70 71
}

G
groot 已提交
72
MemVectors::~MemVectors() {
X
Xu Peng 已提交
73 74 75
    if (pIdGenerator_ != nullptr) {
        delete pIdGenerator_;
        pIdGenerator_ = nullptr;
76 77 78 79 80 81
    }
}

/*
 * MemManager
 */
G
groot 已提交
82
MemManager::MemVectorsPtr MemManager::GetMemByTable(
83
        const std::string& table_id) {
X
Xu Peng 已提交
84 85
    auto memIt = memMap_.find(table_id);
    if (memIt != memMap_.end()) {
X
Xu Peng 已提交
86
        return memIt->second;
87
    }
88

X
Xu Peng 已提交
89
    meta::TableFileSchema table_file;
G
groot 已提交
90
    table_file.table_id_ = table_id;
X
Xu Peng 已提交
91
    auto status = pMeta_->CreateTableFile(table_file);
92 93 94
    if (!status.ok()) {
        return nullptr;
    }
X
Xu Peng 已提交
95

G
groot 已提交
96
    memMap_[table_id] = MemVectorsPtr(new MemVectors(pMeta_, table_file, options_));
X
Xu Peng 已提交
97
    return memMap_[table_id];
98 99
}

G
groot 已提交
100
Status MemManager::InsertVectors(const std::string& table_id_,
101 102 103
        size_t n_,
        const float* vectors_,
        IDNumbers& vector_ids_) {
X
Xu Peng 已提交
104
    std::unique_lock<std::mutex> lock(mutex_);
Y
yu yunfeng 已提交
105

X
Xu Peng 已提交
106
    return InsertVectorsNoLock(table_id_, n_, vectors_, vector_ids_);
107 108
}

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

    return Status::OK();
120 121
}

G
groot 已提交
122
Status MemManager::ToImmutable() {
X
Xu Peng 已提交
123 124 125
    std::unique_lock<std::mutex> lock(mutex_);
    for (auto& kv: memMap_) {
        immMems_.push_back(kv.second);
X
Xu Peng 已提交
126
    }
X
Xu Peng 已提交
127

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

G
groot 已提交
132
Status MemManager::Serialize(std::vector<std::string>& table_ids) {
X
Xu Peng 已提交
133
    ToImmutable();
X
Xu Peng 已提交
134
    std::unique_lock<std::mutex> lock(serialization_mtx_);
135 136
    std::string table_id;
    table_ids.clear();
X
Xu Peng 已提交
137 138
    for (auto& mem : immMems_) {
        mem->Serialize(table_id);
139
        table_ids.push_back(table_id);
X
Xu Peng 已提交
140
    }
X
Xu Peng 已提交
141
    immMems_.clear();
142
    return Status::OK();
X
Xu Peng 已提交
143 144
}

G
groot 已提交
145 146 147 148 149 150 151
Status MemManager::EraseMemVector(const std::string& table_id) {
    std::unique_lock<std::mutex> lock(mutex_);
    memMap_.erase(table_id);

    return Status::OK();
}

152

X
Xu Peng 已提交
153
} // namespace engine
J
jinhai 已提交
154
} // namespace milvus
X
Xu Peng 已提交
155
} // namespace zilliz