Lucene优化(解决大量磁盘IO问题) | 学习笔记

简介: 快速学习Lucene优化(解决大量磁盘IO问题)。

开发者学堂课程【Lucene知识精讲与实战(下)Lucene优化(解决大量磁盘IO问题)】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/701/detail/12353


Lucene优化(解决大量磁盘IO问题)

 

一、解决大量磁盘IO问题

1、lucene 优化属于 lucene 中高级的优化概念,lucene 在创建索引时速度快还是慢,搜索时速度快还是慢,从两部分思考问题,利用磁盘 io 问题解决索引和查询速度。从代码层面可以控制磁盘 io,从硬件入手也可以控制,假如是机械硬盘,分转速大小,400转,7200转,12000转,服务器用的都是12000的机械硬盘,读的速度在500多兆每秒,写的速度在200多兆每秒,如果写入的量,读取的量,远远超过磁盘读和写的性能,速度更慢,可以把机械硬盘全部换成固态硬盘,速度会变快。通过代码层面进行优化。

2、解决大量磁盘

1config.setMaxBufferedDocs(100000); 控制写入一个 segment 前内存中保存的 document 的数目,设置较大的数目可以加快建索引速度。通过设置 Buffer 内存中的缓存区大小,优化索引的速度。内存的速度比硬盘速度快,如果往磁盘中写入一个文档,速度很慢,在 lucene 高级存储时讲到过,lucene 中有段,段中存的是索引和文档,设置 Buffer 内存的缓存大小,如果可以达到很大的量,达到上限会批量的把文档写入,不是有一个文档就用磁盘写一个,批量写比一个一个写速度快。通过设置 Buffer 缓存区的大小达到一定量之后,再往磁盘中写文档,数据可以减少磁盘 io,加快速率。如果设置过大,会比较消耗内存。数值指的是存放文档的速度,十万个文档会动用磁盘,每十万个文档往磁盘中写入一次。不优化情况下创建索引会花多长时间。不测试从数据库取数据,因为涉及到从数据库中读数据的快慢程度,跟创建索引没关系。

数值越大索引速度越快,但是会消耗更多的内存。

测试创建索引速度优化

@Throws Exception

@Test

public void createIndexTest2() throws Exception {

从创建分词器到在索引库中写数据,获取当前时间毫秒数start

long start System. currentT imeMillis();

释放完资源后,再获取当前时间毫秒数。

long end = System. currentTimeMillis();

打印消耗的时间,结束时间减起始时间,

System . out . println(" ====消耗的时间为:======"+(end-start)+ "ms");

来到索引库,把已有的数据清除掉。

8.1.png

执行,在没有优化的情况下,1000ms1s7.725s7725ms

/**

*没有优化 小100万条数据,创建索引需要7725ms

*/

//设置在内存中多少个文档向磁盘中批量写入一次数据

config.setMaxBufferedDocs(100000);

清除数据。

8.2.png

测试,十万条写一次数据,操作十次磁盘,6688ms6s多。

再进行优化。

config.setMaxBufferedDocs(500000);

清除数据。

8.3.png

写两次,7106ms。操作磁盘的时间不是特别平均,优化完之后会变快。

//如果设置的数字过大,会过多消耗内存,但是会提升写入磁盘的速度

电脑用的是固态,.mto 接口最新的固态硬盘,由于硬盘速度的原因,所以感觉不出来有明显的差别,如果换成机械硬盘,越是机械硬盘慢的,使用这种优化方法,创建索引时效果越明显。

(2)indexWriter.forceMerge (文档数量);设置N个文档合并为一个段。

段是索引库中的物理文件,就是 segments_1

8.4.png

没有设置数量,在 lucene 中有默认值,每一个版本默认值都不一样。

一千个文档合并成一个段文件,数值越大索引速度越快,搜索速度越慢;十个文档合并成一个段文件,值越小索引速度越慢,搜索速度越快。

网上没有确定的数值,官方也没有确定的数值,根据机器的配置不同,内存大小不同,磁盘速度不同,逐步设置,建议在线上服务器每一个机器设置的值都应该不一样,在服务器上先设置一千个文档,合并成一个段,五万个文档,十万个文档一点一点往上加,最后通过测试找出适合服务器的参数,配置即可。

文档数量设置为100个合并成一个段。

//设置多少给文档合并成一个段文件,数值越大索引速度越快,搜索速度越慢;值越小索引速度越慢,搜索速度越快

indexwriter . forceMerge(100);

把索引库中已经创建好的索引删除。

8.5.png

没有优化前需要7725ms,执行,需要7579ms

indexwriter . forceMerge(1000000);

删除数据。

8.6.png

重新创建索引,运行。6895ms

更高的值意味着索引期间更低的段合并开销,但同时也意味着更慢的搜索速度,因为此时的索引通常会包含更多的段。如果该值设置的过高,能获得更高的索引性能。但若在最后进行索引优化,那么较低的值会带来更快的搜索速度,因为在索引操作期间程序会利用并发机制完成段合并操作。故建议对程序分别进行高低多种值的测试,利用计算机的实际性能来告诉你最优值。

相关文章
|
2月前
|
缓存 运维 Linux
Linux系统调优详解(十二)——IO调优之磁盘测速
Linux系统调优详解(十二)——IO调优之磁盘测速
54 1
|
4月前
|
缓存 关系型数据库 MySQL
MySQL Binlog--事务日志和BINLOG落盘参数对磁盘IO的影响
MySQL Binlog--事务日志和BINLOG落盘参数对磁盘IO的影响
44 0
|
3月前
|
网络协议 Linux C++
Linux C/C++ 开发(学习笔记十二 ):TCP服务器(并发网络编程io多路复用epoll)
Linux C/C++ 开发(学习笔记十二 ):TCP服务器(并发网络编程io多路复用epoll)
56 0
|
10天前
|
Linux
Linux操作系统调优相关工具(三)查看IO运行状态相关工具 查看哪个磁盘或分区最繁忙?
Linux操作系统调优相关工具(三)查看IO运行状态相关工具 查看哪个磁盘或分区最繁忙?
21 0
|
2月前
|
运维 Linux
Linux系统调优详解(五)——磁盘IO状态查看命令
Linux系统调优详解(五)——磁盘IO状态查看命令
49 5
|
1月前
|
NoSQL Java Linux
【Linux IO多路复用 】 Linux 网络编程 认知负荷与Epoll:高性能I-O多路复用的实现与优化
【Linux IO多路复用 】 Linux 网络编程 认知负荷与Epoll:高性能I-O多路复用的实现与优化
60 0
|
1月前
|
Java 大数据 数据库
【Spring底层原理高级进阶】Spring Batch清洗和转换数据,一键处理繁杂数据!Spring Batch是如何实现IO流优化的?本文详解!
【Spring底层原理高级进阶】Spring Batch清洗和转换数据,一键处理繁杂数据!Spring Batch是如何实现IO流优化的?本文详解!
|
3月前
|
Linux 测试技术
百度搜索:蓝易云【linux系统磁盘IO性能检测教程】
这些是在Linux系统中检测磁盘IO性能的常见方法。根据您的需求和具体环境,您可以选择适合您的方法来监视和测试磁盘IO性能。请注意,在进行性能测试时要小心,以避免对系统造成不必要的负载或影响正常运行。
46 0
|
3月前
|
Rust
【一起学Rust · 项目实战】命令行IO项目minigrep——重构优化模块和错误处理
【一起学Rust · 项目实战】命令行IO项目minigrep——重构优化模块和错误处理
40 0
|
8月前
|
Java
java202303java学习笔记第三十五天IO流中不同JDK版本捕获异常的方式1
java202303java学习笔记第三十五天IO流中不同JDK版本捕获异常的方式1
42 0