/******************************************************************************* * Copyright 上海赜睿信息科技有限公司(Zilliz) - All Rights Reserved * Unauthorized copying of this file, via any medium is strictly prohibited. * Proprietary and confidential. ******************************************************************************/ #ifndef MEMMANGE_CPP__ #define MEMMANGE_CPP__ #include #include #include #include #include "MemManager.h" #include "Meta.h" namespace zilliz { namespace vecwise { namespace engine { template MemVectors::MemVectors(const std::shared_ptr& meta_ptr, const meta::GroupFileSchema& schema, const Options& options) : pMeta_(meta_ptr), options_(options), schema_(schema), _pIdGenerator(new SimpleIDGenerator()), pEE_(new EngineT(schema_.dimension, schema_.location)) { } template void MemVectors::add(size_t n_, const float* vectors_, IDNumbers& vector_ids_) { _pIdGenerator->getNextIDNumbers(n_, vector_ids_); pEE_->AddWithIds(n_, vectors_, vector_ids_.data()); for(auto i=0 ; i size_t MemVectors::total() const { return pEE_->Count(); } template size_t MemVectors::approximate_size() const { return pEE_->Size(); } template Status MemVectors::serialize(std::string& group_id) { group_id = schema_.group_id; auto rows = approximate_size(); pEE_->Serialize(); schema_.rows = rows; schema_.file_type = (rows >= options_.index_trigger_size) ? meta::GroupFileSchema::TO_INDEX : meta::GroupFileSchema::RAW; auto status = pMeta_->update_group_file(schema_); LOG(DEBUG) << "New " << ((schema_.file_type == meta::GroupFileSchema::RAW) ? "raw" : "to_index") << " file " << schema_.file_id << " of size " << pEE_->PhysicalSize() / (1024*1024) << " M"; pEE_->Cache(); return status; } template MemVectors::~MemVectors() { if (_pIdGenerator != nullptr) { delete _pIdGenerator; _pIdGenerator = nullptr; } } /* * MemManager */ template typename MemManager::MemVectorsPtr MemManager::get_mem_by_group( const std::string& group_id) { auto memIt = _memMap.find(group_id); if (memIt != _memMap.end()) { return memIt->second; } meta::GroupFileSchema group_file; group_file.group_id = group_id; auto status = _pMeta->add_group_file(group_file); if (!status.ok()) { return nullptr; } _memMap[group_id] = MemVectorsPtr(new MemVectors(_pMeta, group_file, options_)); return _memMap[group_id]; } template Status MemManager::add_vectors(const std::string& group_id_, size_t n_, const float* vectors_, IDNumbers& vector_ids_) { std::unique_lock lock(_mutex); return add_vectors_no_lock(group_id_, n_, vectors_, vector_ids_); } template Status MemManager::add_vectors_no_lock(const std::string& group_id, size_t n, const float* vectors, IDNumbers& vector_ids) { MemVectorsPtr mem = get_mem_by_group(group_id); if (mem == nullptr) { return Status::NotFound("Group " + group_id + " not found!"); } mem->add(n, vectors, vector_ids); return Status::OK(); } template Status MemManager::mark_memory_as_immutable() { std::unique_lock lock(_mutex); for (auto& kv: _memMap) { _immMems.push_back(kv.second); } _memMap.clear(); return Status::OK(); } template Status MemManager::serialize(std::vector& group_ids) { mark_memory_as_immutable(); std::unique_lock lock(serialization_mtx_); std::string group_id; group_ids.clear(); for (auto& mem : _immMems) { mem->serialize(group_id); group_ids.push_back(group_id); } _immMems.clear(); return Status::OK(); } } // namespace engine } // namespace vecwise } // namespace zilliz #endif