Lucene 的 Directory類就像它的意思一樣“目錄”,如“目錄”不存在,第一次啟動被創(chuàng)建,一旦文件被創(chuàng)建,它只能打開閱讀,或刪除。允許讀取和寫入隨機訪問。Java I/O api 不能直接使用,只能通過這個API 。Directory的實現(xiàn)類可以分為文件目錄,內(nèi)存目錄和目錄的代理類及工具類。具體如下圖所示:
一:文件目錄
SimpleFSDirectory:FSDirectory的簡單實現(xiàn),并發(fā)能力有限,遇到多線程讀同一個文件時會遇到瓶頸,通常用NIOFSDirectory或MMapDirectory代替。
NIOFSDirectory:通過java.nio's FileChannel實行定位讀取,支持多線程讀(默認情況下是線程安全的)。該類僅使用FileChannel進行讀操作,寫操作則是通過FSIndexOutput實現(xiàn)。
注意:NIOFSDirectory 不適用于Windows系統(tǒng),另外如果一個訪問該類的線程,在IO阻塞時被interrupt或cancel,將會導致底層的文件描述符被關閉,后續(xù)的線程再次訪問NIOFSDirectory時將會出現(xiàn)ClosedChannelException異常,此種情況應用SimpleFSDirectory代替。
MMapDirectory:通過內(nèi)存映射進行讀,通過FSIndexOutput進行寫的FSDirectory實現(xiàn)類。使用該類時要保證用足夠的虛擬地址空間。另外當通過IndexInput的close方法進行關閉時并不會立即關閉底層的文件句柄,只有GC進行資源回收時才會關閉。
為了能適應各個操作系統(tǒng)選擇最佳Directory方案,lucene 提供FSDirectory類的靜態(tài)方法open()實現(xiàn)自適應。
public static FSDirectory open(File path, LockFactory lockFactory) throws IOException {
if ((Constants.WINDOWS || Constants.SUN_OS || Constants.LINUX)
&& Constants.JRE_IS_64BIT && MMapDirectory.UNMAP_SUPPORTED) {
return new MMapDirectory(path, lockFactory);
} else if (Constants.WINDOWS) {
return new SimpleFSDirectory(path, lockFactory);
} else {
return new NIOFSDirectory(path, lockFactory);
}
}
二:內(nèi)存目錄
RAMDirectory:常駐內(nèi)存的Directory實現(xiàn)方式。默認通過SingleInstanceLockFactory(單實例鎖工廠)進行鎖的實現(xiàn)。該類不適合大量索引的情況。另外也不適用于多線程的情況。 在索引數(shù)據(jù)量大的情況下建議使用MMapDirectory代替。RAMDirectory是Directory抽象類在使用內(nèi)存最為文件存儲的實現(xiàn)類,其主要是將所有的索引文件保存到內(nèi)存中。這樣可以提高效率。但是如果索引文件過大的話,則會導致內(nèi)存不足,因此,小型的系統(tǒng)推薦使用,如果大型的,索引文件達到G級別上,推薦使用FSDirectory。
NRTCachingDirectory:是對RAMDirectory的封裝,適用于近乎時時(near-real-time)操作的環(huán)境。
三:Direcotry的代理類及工具類
FileSwitchDirectory:文件切換的Directory實現(xiàn).針對lucene的不同的索引文件使用不同的Directory .借助FileSwitchDirectory整合不同的Directory實現(xiàn)類的優(yōu)點于一身
比如MMapDirectory,借助內(nèi)存映射文件方式提高性能,但又要減少內(nèi)存切換的可能 ,當索引太大的時候,內(nèi)存映射也需要不斷地切換,這樣優(yōu)點也可能變?nèi)秉c,而之前的NIOFSDirectory實現(xiàn)java NIO的方式提高高并發(fā)性能,但又因高并發(fā)也會導致IO過多的影響,所以這次可以借助FileSwitchDirectory發(fā)揮他們兩的優(yōu)點。
RateLimitedDirectoryWrapper:通過IOContext來限制讀寫速率的Directory封裝類。
CompoundFileDirectory:用于訪問一個組合的數(shù)據(jù)流。僅適用于讀操作。對于同一段內(nèi)擴展名不同但文件名相同的所有文件合并到一個統(tǒng)一的.cfs文件和一個對應的.cfe文件內(nèi)。
.cfs文件由Header,FileData和FileCount組成。.cfe文件由Header,FileCount,FileName,DataOffset,DataLength組成。.cfs文件中存儲著索引的概要信息及組合文件
的數(shù)目(FileCount)。.cfe文件存儲文件目錄的條目內(nèi)容,內(nèi)容中包括文件數(shù)據(jù)扇區(qū)的起始位置,文件的長度及文件的名稱。
TrackingDirectoryWrapper:Directory的代理類。用于記錄哪些文件被寫入和刪除。
四:Direcotry讀寫對象的類圖
文章轉載過來的!