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 …