2016-10-06 145 views
0

我已經編寫了一個程序來將數據庫數據索引到磁盤,我不確定我的索引速度是否合適,即如果速度非常慢並且速度可以進一步提高。Lucene索引性能

我得到的速度大約是每小時15000個文件,大約相當於索引目錄大小的2600 KB用於創建新索引的大小。

我使用的是Lucene 6.0.0和Windows 8.1 64位操作系統,16 GB RAM和Intel Core i7 8 Core機器。我正在做本地機器上的索引,並不確定我擁有哪種類型的磁盤,這是Windows PC中的常用磁盤。

我正在使用Spring批處理到INNER JOIN兩個數據庫表,並從ItemReader得到一個Row Mapped Object,然後我從這個對象中準備Document

我一直使用的方法,writer.updateDocument(contentDuplicateKeyTerm, doc);而不是addDocument(doc)因爲在Lucene的6.0.0 updateDocument增加了一個文件索引,如果文件尚不除了更新現有的文檔存在。

我不知道任何基準比較我的程序。

請建議。

編輯:現在,我能夠達到每小時約180,000文件的性能。在更新每個Document之後,問題在做IndexWriter.commit(),現在我定期提交併大大提高了性能。

+0

你不能指望人們心靈感應地診斷你的表現問題。解析查詢,Lucene和磁盤輸出的性能,並嘗試找出瓶頸。此外,如果您尚未獲知'addDocument'和'updateDocument'之間的預期性能差異。如果你知道你沒有插入重複項,你可能想使用'addDocument'。 –

+0

是的,你是對的。我不是說我有性能問題,我只是想知道**正常速度**。我編輯了我的問題。我在代碼中發現的一個缺陷是爲每個文檔進行提交。我正在使用'updateDocument',因爲重複項可能會嘗試進入(到目前爲止,沒有辦法預先過濾掉),我們不希望重複索引。 –

+0

提交會產生_huge_差異。預期的速度是「非常高」,本身它應該最大限度地提高旋轉盤的吞吐量(如果這就是你認爲的「通常的」)。 –

回答

0

我犯了很多錯誤,這就是爲什麼寫性能很慢。下面列出了一些錯誤和更正。

1.我在每個文檔之後都提交了,因爲我使用了Spring Batch,所以我在每個塊之後更改了要提交的程序。提交提交間隔顯着提高了性能。

2.我正在關閉並不必要地重新打開編寫器實例(最初的邏輯是這樣設計的)。我改變了程序邏輯,以便在應用程序範圍內維護單個寫入器實例,並在需要的地方繼續使用它。

3.源數據是DB2數據庫,表的讀取速度很慢。我添加了索引來提高讀取性能。

4.Lucene作家是線程安全的,所以我開始用多線程而不是單線程編寫代碼。

因此,在增加lucene寫入程序提交時間間隔後,如果我有足夠的內存來存放大量文檔和文檔,並且準備工作不需要太多時間,索引本身並不需要太多時間。如果其餘處理速度很快,Lucene可以在幾分鐘內索引幾百萬個文檔。