@@ -44,16 +44,22 @@ namespace milvus {
4444using namespace milvus ::cachinglayer;
4545
4646std::pair<size_t , size_t > inline GetChunkIDByOffset (
47- int64_t offset, const std::vector<int64_t >& num_rows_until_chunk) {
47+ int64_t offset,
48+ const std::vector<int64_t >& num_rows_until_chunk,
49+ int64_t virt_chunk_order,
50+ const std::vector<int64_t >& vcid_to_cid_arr) {
4851 // optimize for single chunk case
4952 if (num_rows_until_chunk.size () == 2 ) {
5053 return {0 , offset};
5154 }
52- auto iter = std::lower_bound (
53- num_rows_until_chunk.begin (), num_rows_until_chunk.end (), offset + 1 );
54- size_t chunk_idx = std::distance (num_rows_until_chunk.begin (), iter) - 1 ;
55- size_t offset_in_chunk = offset - num_rows_until_chunk[chunk_idx];
56- return {chunk_idx, offset_in_chunk};
55+ auto vcid = offset >> virt_chunk_order;
56+ auto scid = vcid_to_cid_arr[vcid];
57+ while (scid < num_rows_until_chunk.size () - 1 &&
58+ offset >= num_rows_until_chunk[scid + 1 ]) {
59+ scid++;
60+ }
61+ auto offset_in_chunk = offset - num_rows_until_chunk[scid];
62+ return {scid, offset_in_chunk};
5763}
5864
5965std::pair<std::vector<milvus::cachinglayer::cid_t >,
@@ -104,7 +110,8 @@ std::pair<std::vector<milvus::cachinglayer::cid_t>,
104110 auto offset = offsets[i];
105111 auto vcid = offset >> virt_chunk_order;
106112 auto scid = vcid_to_cid_arr[vcid];
107- while (scid < num_rows_until_chunk.size () - 1 && offset >= num_rows_until_chunk[scid + 1 ]) {
113+ while (scid < num_rows_until_chunk.size () - 1 &&
114+ offset >= num_rows_until_chunk[scid + 1 ]) {
108115 scid++;
109116 }
110117 auto offset_in_chunk = offset - num_rows_until_chunk[scid];
@@ -232,9 +239,7 @@ class ChunkedColumnBase : public ChunkedColumnInterface {
232239 }
233240
234241 void
235- BulkValueAt (void * dst,
236- const int64_t * offsets,
237- int64_t count) override {
242+ BulkValueAt (void * dst, const int64_t * offsets, int64_t count) override {
238243 PanicInfo (ErrorCode::Unsupported,
239244 " BulkValueAt only supported for ChunkedColumn" );
240245 }
@@ -284,18 +289,27 @@ class ChunkedColumnBase : public ChunkedColumnInterface {
284289 // "offset {} is out of range, num_rows: {}",
285290 // offset,
286291 // num_rows_);
287- auto & num_rows_until_chunk = GetNumRowsUntilChunk ();
288- return ::milvus::GetChunkIDByOffset (offset, num_rows_until_chunk);
292+ auto meta = static_cast <milvus::segcore::storagev1translator::CTMeta*>(
293+ slot_->meta ());
294+ auto & num_rows_until_chunk = meta->num_rows_until_chunk_ ;
295+ auto & virt_chunk_order = meta->virt_chunk_order_ ;
296+ auto & vcid_to_cid_arr = meta->vcid_to_cid_arr_ ;
297+ return ::milvus::GetChunkIDByOffset (
298+ offset, num_rows_until_chunk, virt_chunk_order, vcid_to_cid_arr);
289299 }
290300
291301 std::pair<std::vector<milvus::cachinglayer::cid_t >, std::vector<int64_t >>
292302 GetChunkIDsByOffsets (const int64_t * offsets, int64_t count) const override {
293- auto & num_rows_until_chunk = GetNumRowsUntilChunk ();
294- auto meta = static_cast <milvus::segcore::storagev1translator::CTMeta*>(slot_->meta ());
303+ auto meta = static_cast <milvus::segcore::storagev1translator::CTMeta*>(
304+ slot_->meta ());
305+ auto & num_rows_until_chunk = meta->num_rows_until_chunk_ ;
295306 auto & virt_chunk_order = meta->virt_chunk_order_ ;
296307 auto & vcid_to_cid_arr = meta->vcid_to_cid_arr_ ;
297- return ::milvus::GetChunkIDsByOffsets (
298- offsets, count, num_rows_until_chunk, virt_chunk_order, vcid_to_cid_arr);
308+ return ::milvus::GetChunkIDsByOffsets (offsets,
309+ count,
310+ num_rows_until_chunk,
311+ virt_chunk_order,
312+ vcid_to_cid_arr);
299313 }
300314
301315 PinWrapper<Chunk*>
@@ -352,17 +366,15 @@ class ChunkedColumn : public ChunkedColumnBase {
352366 }
353367
354368 void
355- BulkValueAt (void * dst,
356- const int64_t * offsets,
357- int64_t count) override {
369+ BulkValueAt (void * dst, const int64_t * offsets, int64_t count) override {
358370 auto [cids, offsets_in_chunk] = ToChunkIdAndOffset (offsets, count);
359371 auto ca = slot_->PinCells (cids);
360372 auto typed_dst = static_cast <T*>(dst);
361373 for (int64_t i = 0 ; i < count; i++) {
362374 auto chunk = ca->get_ith_cell (cids[i]);
363375 auto value = chunk->ValueAt (offsets_in_chunk[i]);
364- typed_dst[i] = * static_cast < const T*>(
365- static_cast <const void *>(value));
376+ typed_dst[i] =
377+ * static_cast < const T*>( static_cast <const void *>(value));
366378 }
367379 }
368380
@@ -404,9 +416,7 @@ class ChunkedColumn<void> : public ChunkedColumnBase {
404416 }
405417
406418 void
407- BulkValueAt (void * dst,
408- const int64_t * offsets,
409- int64_t count) override {
419+ BulkValueAt (void * dst, const int64_t * offsets, int64_t count) override {
410420 PanicInfo (ErrorCode::Unsupported,
411421 " BulkValueAt is not supported for ChunkedColumn<void>" );
412422 }
@@ -636,35 +646,35 @@ MakeChunkedColumnBase(DataType data_type,
636646 case DataType::INT8 :
637647 return std::static_pointer_cast<ChunkedColumnInterface>(
638648 std::make_shared<ChunkedColumn<int8_t >>(std::move (translator),
639- field_meta));
649+ field_meta));
640650 case DataType::INT16 :
641651 return std::static_pointer_cast<ChunkedColumnInterface>(
642652 std::make_shared<ChunkedColumn<int16_t >>(std::move (translator),
643- field_meta));
653+ field_meta));
644654 case DataType::INT32 :
645655 return std::static_pointer_cast<ChunkedColumnInterface>(
646656 std::make_shared<ChunkedColumn<int32_t >>(std::move (translator),
647- field_meta));
657+ field_meta));
648658 case DataType::INT64 :
649659 return std::static_pointer_cast<ChunkedColumnInterface>(
650660 std::make_shared<ChunkedColumn<int64_t >>(std::move (translator),
651- field_meta));
661+ field_meta));
652662 case DataType::FLOAT :
653663 return std::static_pointer_cast<ChunkedColumnInterface>(
654664 std::make_shared<ChunkedColumn<float >>(std::move (translator),
655665 field_meta));
656666 case DataType::DOUBLE :
657667 return std::static_pointer_cast<ChunkedColumnInterface>(
658668 std::make_shared<ChunkedColumn<double >>(std::move (translator),
659- field_meta));
669+ field_meta));
660670 case DataType::BOOL :
661671 return std::static_pointer_cast<ChunkedColumnInterface>(
662672 std::make_shared<ChunkedColumn<bool >>(std::move (translator),
663- field_meta));
673+ field_meta));
664674 default :
665675 return std::static_pointer_cast<ChunkedColumnInterface>(
666676 std::make_shared<ChunkedColumn<void >>(std::move (translator),
667- field_meta));
677+ field_meta));
668678 }
669679}
670680
0 commit comments