Rising Sun

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            148 隨筆 :: 0 文章 :: 22 評論 :: 0 Trackbacks

          Lucene Directory類就像它的意思一樣“目錄”,如“目錄”不存在,第一次啟動被創(chuàng)建,一旦文件被創(chuàng)建,它只能打開閱讀,或刪除。允許讀取和寫入隨機訪問。Java I/O api 不能直接使用,只能通過這個API Directory的實現(xiàn)類可以分為文件目錄,內(nèi)存目錄和目錄的代理類及工具類。具體如下圖所示:


          一:文件目錄

          SimpleFSDirectory:FSDirectory的簡單實現(xiàn),并發(fā)能力有限,遇到多線程讀同一個文件時會遇到瓶頸,通常用NIOFSDirectoryMMapDirectory代替。

          NIOFSDirectory:通過java.nio's FileChannel實行定位讀取,支持多線程讀(默認情況下是線程安全的)。該類僅使用FileChannel進行讀操作,寫操作則是通過FSIndexOutput實現(xiàn)。

          注意:NIOFSDirectory 不適用于Windows系統(tǒng),另外如果一個訪問該類的線程,在IO阻塞時被interruptcancel,將會導致底層的文件描述符被關閉,后續(xù)的線程再次訪問NIOFSDirectory時將會出現(xiàn)ClosedChannelException異常,此種情況應用SimpleFSDirectory代替。

          MMapDirectory:通過內(nèi)存映射進行讀,通過FSIndexOutput進行寫的FSDirectory實現(xiàn)類。使用該類時要保證用足夠的虛擬地址空間。另外當通過IndexInputclose方法進行關閉時并不會立即關閉底層的文件句柄,只有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代替。RAMDirectoryDirectory抽象類在使用內(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文件由HeaderFileDataFileCount組成。.cfe文件由HeaderFileCount,FileName,DataOffset,DataLength組成。.cfs文件中存儲著索引的概要信息及組合文件
          的數(shù)目(FileCount)。.cfe文件存儲文件目錄的條目內(nèi)容,內(nèi)容中包括文件數(shù)據(jù)扇區(qū)的起始位置,文件的長度及文件的名稱。

          TrackingDirectoryWrapperDirectory的代理類。用于記錄哪些文件被寫入和刪除。

          四:Direcotry讀寫對象的類圖




           文章轉載過來的!

          posted on 2015-01-07 10:09 brock 閱讀(277) 評論(0)  編輯  收藏 所屬分類: Lucene

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導航:
           
          主站蜘蛛池模板: 建德市| 梅河口市| 定安县| 舒兰市| 女性| 西城区| 项城市| 灵川县| 商丘市| 宁明县| 呼图壁县| 平潭县| 湖北省| 来宾市| 江都市| 盖州市| 衡南县| 莒南县| 亳州市| 溧阳市| 通化县| 师宗县| 贵南县| 德阳市| 平原县| 寿阳县| 绵阳市| 乐清市| 凭祥市| 民丰县| 宝丰县| 阿克陶县| 唐山市| 栖霞市| 玛沁县| 太保市| 长海县| 宿松县| 邹城市| 桐庐县| 金华市|