Rising Sun

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            148 隨筆 :: 0 文章 :: 22 評論 :: 0 Trackbacks
          <2015年1月>
          28293031123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          常用鏈接

          留言簿(10)

          隨筆分類

          隨筆檔案

          相冊

          java--->ajax

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

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


          一:文件目錄

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

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

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

          MMapDirectory:通過內存映射進行讀,通過FSIndexOutput進行寫的FSDirectory實現類。使用該類時要保證用足夠的虛擬地址空間。另外當通過IndexInputclose方法進行關閉時并不會立即關閉底層的文件句柄,只有GC進行資源回收時才會關閉。

           

          為了能適應各個操作系統選擇最佳Directory方案,lucene 提供FSDirectory類的靜態方法open()實現自適應。

           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);

              }

            }

          二:內存目錄

          RAMDirectory:常駐內存的Directory實現方式。默認通過SingleInstanceLockFactory(單實例鎖工廠)進行鎖的實現。該類不適合大量索引的情況另外也不適用于多線程的情況 在索引數據量大的情況下建議使用MMapDirectory代替。RAMDirectoryDirectory抽象類在使用內存最為文件存儲的實現類,其主要是將所有的索引文件保存到內存中。這樣可以提高效率。但是如果索引文件過大的話,則會導致內存不足,因此,小型的系統推薦使用,如果大型的,索引文件達到G級別上,推薦使用FSDirectory

          NRTCachingDirectory:是對RAMDirectory的封裝,適用于近乎時時(near-real-time)操作的環境。

          三:Direcotry的代理類及工具類

          FileSwitchDirectory:文件切換的Directory實現.針對lucene的不同的索引文件使用不同的Directory .借助FileSwitchDirectory整合不同的Directory實現類的優點于一身
          比如MMapDirectory,借助內存映射文件方式提高性能,但又要減少內存切換的可能 ,當索引太大的時候,內存映射也需要不斷地切換,這樣優點也可能變缺點,而之前的NIOFSDirectory實現java NIO的方式提高高并發性能,但又因高并發也會導致IO過多的影響,所以這次可以借助FileSwitchDirectory發揮他們兩的優點。

          RateLimitedDirectoryWrapper:通過IOContext來限制讀寫速率的Directory封裝類。

          CompoundFileDirectory:用于訪問一個組合的數據流。僅適用于讀操作。對于同一段內擴展名不同但文件名相同的所有文件合并到一個統一的.cfs文件和一個對應的.cfe文件內。
          .cfs文件由HeaderFileDataFileCount組成。.cfe文件由HeaderFileCount,FileName,DataOffset,DataLength組成。.cfs文件中存儲著索引的概要信息及組合文件
          的數目(FileCount)。.cfe文件存儲文件目錄的條目內容,內容中包括文件數據扇區的起始位置,文件的長度及文件的名稱。

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

          四:Direcotry讀寫對象的類圖




           文章轉載過來的!

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

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


          網站導航:
           
          主站蜘蛛池模板: 钟山县| 红安县| 杨浦区| 饶河县| 扎兰屯市| 金堂县| 公主岭市| 钟祥市| 镇安县| 临汾市| 广丰县| 遵义县| 当雄县| 射洪县| 德庆县| 凤冈县| 双流县| 蓬安县| 全州县| 晋宁县| 彭山县| 肥东县| 嵊州市| 合作市| 永川市| 孟州市| 清苑县| 平罗县| 无棣县| 翼城县| 浦县| 东乡族自治县| 泰和县| 南木林县| 临沭县| 天柱县| 芮城县| 永州市| 古浪县| 苗栗市| 嘉荫县|