【lucene】SegmentReader初始化過程概述

readers[i] =
new SegmentReader(sis.info(i), sis.getIndexCreatedVersionMajor(), IOContext.READ);
這個方法已經把所有的文件都讀完了么?

沒有“讀完”,但已經**全部“打開”**了。

| 動作 | 是否發生 |
|---|---|
| **打開文件句柄 / mmap** | ? 立即完成 |
| **讀取文件頭、校驗魔數、版本** | ? 立即完成 |
| **把整個文件內容拷貝到內存** | ? **不會** |
| **讀取所有倒排表、doc values、stored fields 內容** | ? **按需 lazily** |

### 具體發生了什么

1. `new SegmentReader(...)` → `new SegmentCoreReaders(...)` ?
這一步對 **每一個涉及的索引文件**(`.tim/.tip/.doc/.fdt/.fdx/.dim/.dvd/.vex/.vec…`)執行:
- `directory.openInput(...)` 或 `cfsDir.slice(...)` ?
- 讀文件頭 4~16 字節驗證魔數、版本號、校驗和 ?
- 把 `IndexInput`(文件句柄或 mmap 區域)包裝成對應的 `*Reader` 對象 ?
→ **文件已打開,指針處于文件起始。**

2. 真正的倒排列表、文檔值、向量、stored fields **內容** ?
只有在搜索階段調用:
- `TermsEnum.next()` ?
- `StoredFieldsVisitor.visitDocument(docID)` ?
- `PointValues.intersect(...)` ?
- `VectorValues.vectorValue(docID)` ?
時,才從剛才打開的 `IndexInput` 中 **按需 seek / 順序讀取** 對應塊。

### 一句話總結

> `SegmentReader` 構造階段 **只完成“打開文件 + 讀取頭部/元數據”**; ?
> 所有數據內容 **按需惰性讀取**,不會一次性把整個文件讀進內存。

只是把一些元數據文件讀了是吧?

**不是“只是”讀元數據文件,而是把所有索引文件的“頭部/元數據”都讀了,并把底層文件句柄全部打開**;真正的數據主體仍留在磁盤,按需懶加載。 ?

| 文件類型 | 構造階段已讀取 | 構造階段已打開 | 數據主體是否一次性讀入 |
| --- | --- | --- | --- |
| `.fnm` | ? 全部 | ? | ?(很小) |
| `.fdt/.fdx` | ? 文件頭 | ? | ? |
| `.tim/.tip/.doc` 等倒排 | ? 文件頭 | ? | ? |
| `.dim/.dii`(BKD) | ? 文件頭+根節點元數據 | ? | ? |
| `.dvd/.dvm`(DocValues) | ? 文件頭+元數據 | ? | ? |
| `.vex/.vec`(HNSW) | ? 文件頭+元數據 | ? | ? |

所以: ?
- **元數據 + 文件頭** 已讀(為了校驗、建立內存結構)。 ?
- **所有文件句柄已打開**(后續 seek/讀取零成本)。 ?
- **數據主體**(倒排表、BKD 塊、向量、stored fields 內容)**仍懶加載**,不會一次性讀空磁盤。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/90734.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/90734.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/90734.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

通俗理解主機的BIOS和UEFI啟動方式

“對于 22.04 版本,這些操作說明應適用于通過 BIOS 或 UEFI 兩種方式創建和運行啟動盤。”我們來詳細解釋一下這句話的含義,這句話的核心意思是:你按照這個教程制作出來的 Ubuntu U 盤,將擁有極佳的兼容性,無論是在老電…

Canal 1.1.7的安裝

數據庫操作的準備 1、開啟 Binlog 寫入功能,配置 binlog-format 為 ROW 模式,my.cnf 中配置如下: vi /etc/my.cnf [mysqld] log-binmysql-bin # 開啟 binlog binlog-formatROW # 選擇 ROW 模式 server_id1 # 配置 MySQL replaction 需要定義,…

python---類型轉換

文章目錄1. 基本類型轉換函數int() - 轉換為整數float() - 轉換為浮點數str() - 轉換為字符串bool() - 轉換為布爾值2. 其他類型轉換list() - 轉換為列表tuple() - 轉換為元組set() - 轉換為集合(去重)dict() - 轉換為字典3. 注意事項1. 兼容性&#xff…

JVM terminated. Exit code=1

出現JVM terminated. Exit code1錯誤通常是因為 Eclipse 所需的 Java 版本與系統中配置的 Java 版本不匹配。從錯誤信息中可以看到關鍵線索:-Dosgi.requiredJavaVersion21,表示此 Eclipse 版本需要 Java 21 或更高版本,但系統當前使用的是 Ja…

20250727-1-Kubernetes 網絡-Ingress介紹,部署Ingres_筆記

一、NodePort存在的不足 ?1. 四層負載均衡 ?? 實現技術: 基于iptables和ipvs實現 OSI層級: 位于傳輸層(第四層) 轉發依據: 基于IP地址和端口進行轉發 特點: 只能看到IP和端口信息 無法識別應用層協議內容 配置簡單但功能有限 2. 七層負載均衡 ?1)七層負載均衡的概念 ?…

Javaweb————HTTP的九種請求方法介紹

??????一.HTTP1.0定義的三種請求方式介紹 🏍?🏍?🏍?(1)GET請求 作用:向服務器獲取資源,比如常見的查詢請求 應用場景:絕大多數場景,比如我們訪問商城首頁查看圖…

C++day06(練習題)

循序漸進-基礎訓練 格式化輸入輸出 【描述】格式化輸入輸出練習輸入三個整數和一個浮點數,浮點數需要保留的不同小數點后面的數字。 【輸入描述】三個正整數以及以一個浮點數 【輸出描述】三個整數以及保留不同位數的浮點數 【樣例輸入】 1 2 3 9.12345678 【樣例輸…

基于大模型的預訓練、量化、微調等完整流程解析

隨著大語言模型(LLM)的飛速發展,模型的訓練、部署與優化成為了AI工程領域的重要課題。本文將從 預訓練、量化、微調 等關鍵步驟出發,詳細介紹大模型的完整技術流程及相關實踐。1. 預訓練(Pre-training) 1.1…

AI入門學習-模型評估示例講解

from sklearn.metrics import classification_report, confusion_matrix from sklearn.model_selection import train_test_split from sklearn.ensemble import RandomForestClassifier from sklearn.datasets import make_classification# 生成示例分類數據 # n_samples: 樣本…

Python編程:初入Python魔法世界

一、常量表達式在編程中,常量指的是在程序執行期間其值不會改變的數據項。雖然 Python 并沒有專門的語法來定義常量(不像某些其他語言如 Java 中有 final 關鍵字),但在實踐中,我們通常通過約定俗成的方式來表示一個變量…

Android WorkManager 詳解:高效管理后臺任務

引言在現代移動應用開發中,后臺任務處理是一個至關重要的功能。從同步數據到定期備份,從發送通知到處理耗時操作,后臺任務無處不在。然而,Android系統對后臺任務的限制越來越嚴格,開發者需要找到既高效又符合系統規范的…

MCU(微控制器)中的高電平與低電平?

MCU(微控制器)中的高電平與低電平? 在數字電路和MCU(微控制器)中,**高電平(High Level)和低電平(Low Level)**是兩種基本的邏輯狀態,用于表示二進…

前端項目下載發票pdf文件要求改文件名筆記

1、a鏈接&#xff08;修改失敗&#xff0c;存在跨域&#xff09;<el-table-columnalignrightlabel"下載地址"width"200"><template slot-scope"{row}"><a :href"row.dataUrl" download"文件名">下載</…

Kotlin 數據容器 - List(List 概述、創建 List、List 核心特性、List 元素訪問、List 遍歷)

一、List 概述List 是一個不可變的有序集合&#xff0c;一旦創建就不能修改其內容&#xff0c;即不能添加、刪除、更改元素List 提供了豐富的操作函數來處理數據二、創建 List 1、基礎創建 通過 listOf 函數創建&#xff08;推薦&#xff09; // 創建一個 List&#xff0c;包含…

HarmonyOS NEXT 系列之規范開發三方共享包

規范開發三方共享包〇、前言一、了解評分規則二、規范開發共享包1、規范開源協議名稱寫法2、將 oh-package.json5 文件補充完整3、補充 example 目錄4、基本的 README 和 CHANGELOG三、ohpm 包的源碼隔離特性〇、前言 對于開發者來說&#xff0c;對外發布代碼制品&#xff0c;…

[電網備考]計算機組成與原理

計算機系統概述 計算機發展歷程 從數據表示: 計算機可以分為數字計算機與模擬計算機 1946 第一臺電子數字計算機 ENIAC 在賓夕法尼亞大學誕生,標志進入電子計算機時代時間計算機發展階段1946-1958電子管計算機時代1958-1964晶體管計算機時代1964-1971集成電路計算機時代1971-至…

8.c語言指針

內存管理C語言中&#xff0c;棧內存&#xff08;局部變量&#xff09;自動分配/釋放&#xff0c;靜態區&#xff08;全局、靜態變量&#xff09;編譯時分配&#xff1b;堆內存需手動分配/釋放&#xff0c;核心函數有3個&#xff1a;malloc函數原型&#xff1a;void* malloc(siz…

使用GPU訓練模型

本文代碼詳解參考&#xff1a; 模型訓練基礎流程-CSDN博客 目錄 為什么要用GPU訓練模型 什么是CUDA 利用GPU訓練—方式一(.cuda()) 利用GPU訓練—方式二 (.to()) Google Colaboratory 為什么要用GPU訓練模型 用 GPU 訓練模型的核心原因是GPU 的硬件架構和計算特性&#…

Matlab學習筆記:自定義函數

MATLAB 學習筆記&#xff1a;自定義函數自定義函數是MATLAB編程的基礎&#xff0c;它允許你將重復代碼封裝成可重用的模塊&#xff0c;提高代碼的可讀性和效率。本筆記將覆蓋所有重點知識點&#xff0c;包括語法細節、輸入輸出處理、函數文件管理、錯誤處理等。我會用自然易懂的…

【數學建模 | Matlab】二維繪圖 和 三維繪圖

- 第 115 篇 - Date: 2025 - 07 - 23 Author: 鄭龍浩&#xff08;仟墨&#xff09; 續寫上一篇&#xff0c;如下文章&#xff1a; 【數學建模|Matlab】Matlab「基礎知識」和「基礎操作」 五 二維繪圖 1 舉例 % 二維平面繪圖&#xff08;擴展至 -2π 到 2π&#xff09; x …