From 7fd76c40720587ad868be8d9624db924af17672b Mon Sep 17 00:00:00 2001 From: groot Date: Tue, 22 Dec 2020 10:06:22 +0800 Subject: [PATCH] #4488 get_entity_by_id() performance is poor in 0.11.0 (#4489) * #4488 get_entity_by_id() performance is poor in 0.11.0 Signed-off-by: yhmo * add changelog Signed-off-by: yhmo Signed-off-by: shengjun.li --- CHANGELOG.md | 1 + core/src/codecs/BlockFormat.cpp | 22 +++++----------------- 2 files changed, 6 insertions(+), 17 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 26f49846dd..31e92491b9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -40,6 +40,7 @@ Please mark all changes in change log and use the issue from GitHub - \#4302 Setting DSL fields is invalid in restful api, fields are not returned - \#4329 C++ sdk sdk_binary needs to update - \#4418 Fix search when there are multiple vector fields +- \#4488 get_entity_by_id() performance is poor in 0.11.0 ## Feature - \#4163 Update C++ sdk search interface diff --git a/core/src/codecs/BlockFormat.cpp b/core/src/codecs/BlockFormat.cpp index e0aad883d8..ec18747b2d 100644 --- a/core/src/codecs/BlockFormat.cpp +++ b/core/src/codecs/BlockFormat.cpp @@ -87,13 +87,8 @@ BlockFormat::Read(const storage::FSHandlerPtr& fs_ptr, const std::string& file_p fs_ptr->reader_ptr_->Seekg(offset + MAGIC_SIZE + HEADER_SIZE); fs_ptr->reader_ptr_->Read(raw->data_.data(), num_bytes); - - uint32_t record; - fs_ptr->reader_ptr_->Read(&record, SUM_SIZE); fs_ptr->reader_ptr_->Close(); - CHECK_SUM_VALID(header.data(), reinterpret_cast(raw->data_.data()), num_bytes, record); - return Status::OK(); } @@ -116,19 +111,9 @@ BlockFormat::Read(const storage::FSHandlerPtr& fs_ptr, const std::string& file_p HeaderMap map = TransformHeaderData(header); size_t total_num_bytes = stol(map.at("size")); - std::vector data; - data.resize(total_num_bytes); - - fs_ptr->reader_ptr_->Read(data.data(), total_num_bytes); - uint32_t record; - fs_ptr->reader_ptr_->Read(&record, SUM_SIZE); - fs_ptr->reader_ptr_->Close(); - - CHECK_SUM_VALID(header.data(), reinterpret_cast(data.data()), total_num_bytes, record); - int64_t total_bytes = 0; for (auto& range : read_ranges) { - if (range.offset_ > total_num_bytes) { + if (range.offset_ + range.num_bytes_ > total_num_bytes) { return Status(SERVER_INVALID_ARGUMENT, "Invalid argument to read: " + file_path); } total_bytes += range.num_bytes_; @@ -139,10 +124,13 @@ BlockFormat::Read(const storage::FSHandlerPtr& fs_ptr, const std::string& file_p int64_t poz = 0; for (auto& range : read_ranges) { int64_t offset = range.offset_; - memcpy(raw->data_.data() + poz, data.data() + offset, range.num_bytes_); + fs_ptr->reader_ptr_->Seekg(offset + MAGIC_SIZE + HEADER_SIZE); + fs_ptr->reader_ptr_->Read(raw->data_.data() + poz, range.num_bytes_); poz += range.num_bytes_; } + fs_ptr->reader_ptr_->Close(); + return Status::OK(); }