Lucene索引各階段時間花費

2021-09-02 20:17:42 字數 3003 閱讀 5780

本文中的測試方法或測試資料,如有不正確的地方,望不吝指正。

這篇文章主要是記錄lucene7.5版本建立索引過程中各個階段所花的時間,以及後續的優化過程。測試電腦的配置如下,硬碟為ssd硬碟:

測試是把本地的檔案資料錄入lucene,方便後續的檢索。所有測試都是單執行緒操作。準備的測試資料每條有31個字段,共394794條資料,分為兩次測試,一次是以檔案中不存字段資訊,只將值按照某種格式組裝起來,解析為陣列進行操作,一次是使用json的格式來處理資料。lucene的配置只做了如下調整,其它全部是預設,分詞器選擇的是ik分詞器:

config.

setrambuffersizemb

(100);

indexwriter.

forcemerge(10

);

本地資料封裝最開始使用的是按照某種格式拼接為字串的形式,最開始選用的是string的split方法進行處理,發現它的效能實在是不敢恭維。後面換成stringtokenizer方法進行處理,發現效能也好不了多少,下面是測試對比資料,單位(毫秒):

測試方法

總資料量

第1次耗時

第2次耗時

第3次耗時

第4次耗時

string的split

394794

15309

15448

15484

15513

stringtokenizer

394794

11319

11368

12149

12258

處理的**如下:

//下面這個是字串分割用的測試方法

string[

] values = content.

split

("```");

//下面這個是用stringtokenizer的測試方法

list

values =

newarraylist

<

>()

;stringtokenizer stringtokenizer =

newstringtokenizer

(content,

"```");

while

( stringtokenizer.

hasmoreelements()

)

從上面的資料可以初步看出使用stringtokenizer的處理方式也沒有提公升很多,這個效能還不是我想要的。於是考慮使用json的方式來處理,看看效能怎麼樣。

同樣的字段數轉換為json的方式進行儲存到檔案,再對檔案進行處理。開源的json序列化工具也有好幾個,在網上找到這篇文章各種json效能對比,我選擇它(jsoniter)和我們熟悉的fastjson進行比較測試。

測試方法

總資料量

第1次耗時

第2次耗時

第3次耗時

第4次耗時

fastjson的parseobject方式

394794

19674

19762

19866

19908

jsoniterator的deserialize方式

394794

9696

9860

9887

9975

**如下:

//下面這個是fastjson

jsonobject object = json.

parseobject

(content)

;//下面這個是jsoniterator

any any = jsoniterator.

deserialize

(content)

;

從上面的資料可以看出jsoniterator更勝一籌,所以後續的測試就在它的基礎之上進行。

下面先列出完整過程中各個階段所花費的時間,每個階段是依次進行的,比如第一階段:檔案讀取是把後續步驟注釋掉執行測試的,第二階段json所化的時間是第一階段和第二階段之和,異常類推:

階段總資料量

第1次耗時

第2次耗時

第3次耗時

第4次耗時

檔案讀取

394794

5312

4302

4854

4662

json解析

394794

9099

8596

8268

9056

建立doc

394794

26266

25894

2582

2619

adddocument

394794

133558

12863

13165

126503

adddocuments

394794

125862

14525

146823

145100

建立doc是指:建立各個document的各個field,測試資料是31個字段,因為要涉及到範圍查詢和存值,所以構造完成之後的document有60來個field。adddocument和adddocuments是lucene提供的兩個介面,第乙個的形參是乙個document,而adddocuments的形參是document的乙個list。

jsoniterator在使用過程中發現對這樣對字串解析會出錯:

"/*!40100 set @@sql_mode=\'\' */;"
大家在使用前,先看看自己的資料中是否有這樣的字串。貌似是「\」導致的。還沒去確定。

RUP各階段簡述

用況驅動旨在為到最終產品為止的每個階段都可以回溯到使用者的真正需求。以體系結構為中心是指關注體系結構模式的開發,以引導後續系統,保證系統的平滑演進。每一次迭代包括迭代計畫 迭代評價和一些具體活動。關於核心工作流中的五個活動 需求 分析 設計 實現和測試較好理解,這裡不再贅述。下面對 rup的四個階段...

EFI BIOS各階段介紹

sec是power on 後執行的第乙個部分,要求cpu應事先知道一些平台配置資訊和hw支援特性 產生臨時memory,可以是 processor cache,static ram 或其他在系統早期就可以訪問的system memory。除此還要知道 早期的memory 可以 map 到 boot ...

MongoDB管道聚合各階段

管道聚合各階段 名稱 描述 project 改造流中的文件,像通過增加新的字段或移除存在的字段。對於每乙個輸入文件,輸出乙個文件。match 過濾文件流,只允許匹配的文件不經過修改進入到下乙個管道階段。match使用標準的mongodb查詢。對於每個輸入文件,輸出要麼乙個文件 匹配乙個 要麼零個文件...