Prefetch a vector's page into memory via `madvise(MADV_WILLNEED)`.
(&self, id: u32)
| 393 | |
| 394 | /// Prefetch a vector's page into memory via `madvise(MADV_WILLNEED)`. |
| 395 | pub fn prefetch(&self, id: u32) { |
| 396 | let idx = id as usize; |
| 397 | if idx >= self.count { |
| 398 | return; |
| 399 | } |
| 400 | let byte_len = match self.dim.checked_mul(4) { |
| 401 | Some(v) => v, |
| 402 | None => return, |
| 403 | }; |
| 404 | let Some(idx_bytes) = idx.checked_mul(byte_len) else { |
| 405 | return; |
| 406 | }; |
| 407 | let Some(offset) = self.vec_offset.checked_add(idx_bytes) else { |
| 408 | return; |
| 409 | }; |
| 410 | if offset |
| 411 | .checked_add(byte_len) |
| 412 | .is_none_or(|e| e > self.sid_offset) |
| 413 | { |
| 414 | return; |
| 415 | } |
| 416 | let page_start = offset & !(4095); |
| 417 | let len = (byte_len + 4095) & !(4095); |
| 418 | unsafe { |
| 419 | libc::madvise( |
| 420 | self.base.add(page_start) as *mut libc::c_void, |
| 421 | len, |
| 422 | libc::MADV_WILLNEED, |
| 423 | ); |
| 424 | } |
| 425 | } |
| 426 | |
| 427 | /// Prefetch a batch of vector IDs. |
| 428 | pub fn prefetch_batch(&self, ids: &[u32]) { |