Lucene随笔-ThreadState

2024-06-19 20:08
文章标签 随笔 lucene threadstate

本文主要是介绍Lucene随笔-ThreadState,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Lucene 6.5.4

ThreadState在lucene的curd扮演者非常重要的角色。首先,DocumentsWriterPerThreadPool是一个逻辑上的线程池,它实现了类似Java线程池的功能,
在Java的线程池中,新来的一个任务可以从ExecutorService中获得一个线程去处理该任务,而在DocumentsWriterPerThreadPool中,每当IndexWriter要添加文档,会从DocumentsWriterPerThreadPool中获得一个ThreadState去执行,故在多线程(持有相同的IndexWriter对象引用)执行添加文档操作时,每个线程都会获得一个ThreadState对象。简言之,iw里面的dwtp是通过threadstate来获取的。具体可以看一下DocumentWriter的updateDocument函数。

	final ThreadState perThread = flushControl.obtainAndLock();

上面说了每一个ThreadState通常都会有一个DWTP的引用。但是在两种情况下是不包含dwtp的引用的:

情况一:当一个新的添加文档任务来时,DocumentsWriterPerThreadPool中没有可用的ThreadState对象,那么会生成一个新的ThreadState对象,此时新生成的ThreadState对象没有DWPT的引用(个人理解:从源码结构上看ThreadState的构造函数所在的类DocumentsWriterPerThreadPool没有可用的生成一个DWPT对象所需要的参数)

情况二:上文中提到DWPT在执行完添加文档操作后,会收集numDocs跟IndexByteUsed的值,其中IndexByteUsed的值会被累加到一个全局的变量activeBytes(线程共享)中,另外还有一个全局变量deleteRamByteUsed,它描述了被删除文档的信息占用的内存大小(在后面介绍flush的文章中会展开),如果activeBytes与deleteRamByteUsed的和值,以及numDocs 分别超过下面两个变量,那么持有DWPT的ThreadState会被标记为flushPending状态,并且失去该DWPT的引用,随后DWPT执行doFlush操作,将收集到的索引信息生成索引文件:

ramBufferSizeMB:该值描述了索引信息被写入到磁盘前暂时缓存在内存中允许的最大使用内存值
maxBufferedDocs:该值描述了索引信息被写入到磁盘前暂时缓存在内存中允许的文档最大数量,这里注意的是这里指的是一个DWPT允许添加的最大文档数量,在多线程下,可以同时存在多个DWPT,而maxBufferedDocs并不是所有线程的DWPT中添加的文档数量和值

ThreadState定义在DWPTP中,这也是一个很重要的类,每个iw拥有一个DWPTP,用来管理iw拥有的线程,在其中还有两个比较容易困惑的变量。

 private final List<ThreadState> threadStates = new ArrayList<>();private final List<ThreadState> freeList = new ArrayList<>();

当ThreadState执行完添加文档的任务后,它会回到DocumentsWriterPerThreadPool中,等待下次的文档添加操作,通过一个名为freeList的链表来存储。而threadStates则是用来存储所有的threadStates,包括active threadState 以及freeList里面的threadState,同时他只会增加,不会减少。比如在进行主动flush时,会从threadStates链表中回去所有满足条件的dwpt。

threadStates本质时一把锁,在lucene中添加和更新文档与flush时同步操作,假设某个dwpt同时进行文档操作以及flush时,会出现问题。因此这个时候threadStates的作用就体现了。当一个dwpt满足flush需求时,正在进行添加文档的操作,此时会等待文档添加后在进行fulsh。

这篇关于Lucene随笔-ThreadState的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1076019

相关文章

MySQL和Lucene(Elasticsearch)索引对比分析

点击上方蓝色字体,选择“设为星标” 回复”资源“获取更多资源 大数据技术与架构 点击右侧关注,大数据开发领域最强公众号! 大数据真好玩 点击右侧关注,大数据真好玩! 本文是来自略速互联网笔记的分享。 你可以在这里查看原文:http://www.lvesu.com/?uri=/blog/main/cms-611.html 前言 相比于大多数人熟悉的 MySQL 数据库的索引,Elasti

【 Android 应用开发随笔】-- PackageInstaller.SessionCallback

PackageInstaller.SessionCallback 是 Android 开发中的一个接口,用于在应用程序安装过程中接收安装状态的回调。这个接口属于 android.content.pm.PackageInstaller 类,主要用于处理通过 PackageInstaller 类进行的包安装。 主要功能 ◾ 安装进度通知: PackageInstaller.SessionCal

程序员的自我修养--术语随笔

PLT PLT(Procedure Linkage Table)是用于动态链接共享库中函数调用的一种数据结构,它在程序运行时起着至关重要的作用。下面是对 PLT 的详细解释:作用: PLT 主要用于实现库函数的延迟绑定(dynamic binding)。它负责将程序中对共享库中函数的调用映射到最终的共享库函数的地址上,并且支持共享库的重定位。 实现原理: 当一个程序调用共享库中的函数时,对应的

强化学习实操入门随笔

碎碎念:经过思考,打通底层逻辑,我认为未来ai的功能是在沟通领域代替人,未来人-人模式(媒介是死的语言,比如看古人留下的文字、聊天的暂时不在)会变成人-ai替身-人模式(符合本人想法的“预测个性化语言”)。由于沟通越来越虚拟化和低成本,以及各种模态(比如视频链接)的数字媒介比见面聊天效率更高,所以制作人的各种在虚拟数字空间的“替身”(模仿聊天、总结信息等秘书类事务)是很可能出现的重点问题。

周末随笔 | 笔耕者的悲哀 —— 盗亦无道

欢迎跳转到本文的原文链接:https://honeypps.com/talk/the-thief-has-no-way/ 今天所要说的不是技术,而是盗版这个现象。对于技术公众号来说,很少会写一些技术之外的东西。而且写一些实事类的东西对触碰到一部分人的利益,更有甚者会被“安排”。 对于盗版,我其实已经习惯了,也早已习惯地采取“鸵鸟策略”来应对。不过昨天发生的一件事情确实有点让人寒心。 前天我的

第三章 操作符读书随笔

1、 赋值运算符“=”:     对于基本类型来说,是把基本类型的实际内容赋给了左边的变量。     对于对象类型来说,是把对象的引用赋给了左边的变量。不同的变量可以引用同一个对象的引用,从而指向同一个对象。 2、整数除法“/”     进行除法的时候,只获取整数部分,不会四舍五入。 3、逻辑比较运算符“==”     逻辑等于运算符,比较的是对象的引用,一般情况下会根据equals方

随笔十、音频扩展模块测试

本项测试简单,对购买的音频扩展模块进行录音放音测试 按照使用说明,连接音频小板,一个喇叭一个麦克风,4根线,buildroot系统镜像 录音测试 root@RK356X:/# arecord -c 1 -r 44100 -f S16_LE /tmp/record.wav Recording WAVE '/tmp/record.wav' : Signed 16 bit Little En

随笔1:数学建模与数值计算

目录 1.1 矩阵运算 1.2 基本数学函数 1.3 数值求解 数学建模与数值计算 是将实际问题通过数学公式和模型进行描述,并通过计算获得模型解的过程。这是数学建模中最基本也是最重要的环节之一。下面是详细的知识点讲解及相应的MATLAB代码示例。 1.1 矩阵运算 知识点讲解: 在数学建模中,矩阵运算是非常基础且重要的工具。许多实际问题可以通过矩阵来表示,例如线性方程

2024年8月总结及随笔之逝

1. 回头看 日更坚持了609天。 读《零信任网络:在不可信网络中构建安全系统》更新完成读《软件开发安全之道:概率、设计与实施》开更并持续更新 2023年至2024年8月底累计码字1463007字,累计日均码字2402字。 2024年8月码字109278字,同比增长177.6%,环比增长27.3%,日均码字数3525字,累计码字745044字,累积日均码字3053字。 读完以下这些书

随笔九、SARADC按键程控测试

目录 1. 泰山派环境 2. 按键3分析 3. 编程测试 1. 泰山派环境 泰山派开发板上有3个按键 按键1是电源按键PWRON,实测按几下会导致开发板重启 按键2是复位按键RESET,按下立马复位重启 按键3是升级按键RECOVER,配合RESET按键可以使开发板进入Loader 烧写模式 一般来说开发板都会给用户提供一个用户按键,看样子泰山派用户按键是需要自己用G