<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Rising Sun

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

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


    一:文件目錄

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

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

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

    MMapDirectory:通過內(nèi)存映射進(jìn)行讀,通過FSIndexOutput進(jìn)行寫的FSDirectory實(shí)現(xiàn)類。使用該類時(shí)要保證用足夠的虛擬地址空間。另外當(dāng)通過IndexInputclose方法進(jìn)行關(guān)閉時(shí)并不會(huì)立即關(guān)閉底層的文件句柄,只有GC進(jìn)行資源回收時(shí)才會(huì)關(guān)閉。

     

    為了能適應(yīng)各個(gè)操作系統(tǒng)選擇最佳Directory方案,lucene 提供FSDirectory類的靜態(tài)方法open()實(shí)現(xiàn)自適應(yīng)。

     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實(shí)現(xiàn)方式。默認(rèn)通過SingleInstanceLockFactory(單實(shí)例鎖工廠)進(jìn)行鎖的實(shí)現(xiàn)。該類不適合大量索引的情況另外也不適用于多線程的情況 在索引數(shù)據(jù)量大的情況下建議使用MMapDirectory代替。RAMDirectoryDirectory抽象類在使用內(nèi)存最為文件存儲(chǔ)的實(shí)現(xiàn)類,其主要是將所有的索引文件保存到內(nèi)存中。這樣可以提高效率。但是如果索引文件過大的話,則會(huì)導(dǎo)致內(nèi)存不足,因此,小型的系統(tǒng)推薦使用,如果大型的,索引文件達(dá)到G級(jí)別上,推薦使用FSDirectory

    NRTCachingDirectory:是對(duì)RAMDirectory的封裝,適用于近乎時(shí)時(shí)(near-real-time)操作的環(huán)境。

    三:Direcotry的代理類及工具類

    FileSwitchDirectory:文件切換的Directory實(shí)現(xiàn).針對(duì)lucene的不同的索引文件使用不同的Directory .借助FileSwitchDirectory整合不同的Directory實(shí)現(xiàn)類的優(yōu)點(diǎn)于一身
    比如MMapDirectory,借助內(nèi)存映射文件方式提高性能,但又要減少內(nèi)存切換的可能 ,當(dāng)索引太大的時(shí)候,內(nèi)存映射也需要不斷地切換,這樣優(yōu)點(diǎn)也可能變?nèi)秉c(diǎn),而之前的NIOFSDirectory實(shí)現(xiàn)java NIO的方式提高高并發(fā)性能,但又因高并發(fā)也會(huì)導(dǎo)致IO過多的影響,所以這次可以借助FileSwitchDirectory發(fā)揮他們兩的優(yōu)點(diǎn)。

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

    CompoundFileDirectory:用于訪問一個(gè)組合的數(shù)據(jù)流。僅適用于讀操作。對(duì)于同一段內(nèi)擴(kuò)展名不同但文件名相同的所有文件合并到一個(gè)統(tǒng)一的.cfs文件和一個(gè)對(duì)應(yīng)的.cfe文件內(nèi)。
    .cfs文件由HeaderFileDataFileCount組成。.cfe文件由HeaderFileCount,FileName,DataOffset,DataLength組成。.cfs文件中存儲(chǔ)著索引的概要信息及組合文件
    的數(shù)目(FileCount)。.cfe文件存儲(chǔ)文件目錄的條目內(nèi)容,內(nèi)容中包括文件數(shù)據(jù)扇區(qū)的起始位置,文件的長度及文件的名稱。

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

    四:Direcotry讀寫對(duì)象的類圖




     文章轉(zhuǎn)載過來的!

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

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


    網(wǎng)站導(dǎo)航:
    博客園   IT新聞   Chat2DB   C++博客   博問  
     
    主站蜘蛛池模板: 久久亚洲精精品中文字幕| 国产亚洲精品a在线无码| 亚洲一级高清在线中文字幕| 国产精品网站在线观看免费传媒| 国产午夜亚洲不卡| CAOPORN国产精品免费视频| 国产亚洲精aa成人网站| 中国一级毛片免费看视频| 久久久久亚洲AV成人网人人网站| 亚洲精品视频免费| 亚洲中文久久精品无码| 免费看一区二区三区四区| 久久精品国产亚洲AV香蕉| 免费观看AV片在线播放| 亚洲私人无码综合久久网| 在线视频免费国产成人| 免费无遮挡无遮羞在线看| 国产av无码专区亚洲国产精品| aa级女人大片喷水视频免费| 国产亚洲成AV人片在线观黄桃 | 最近2019中文字幕免费看最新| 亚洲熟女综合色一区二区三区| 国产精品酒店视频免费看| 国产JIZZ中国JIZZ免费看| 国产国拍亚洲精品mv在线观看 | 亚洲精品在线视频观看| 日韩毛片免费在线观看| av午夜福利一片免费看久久| 亚洲第一AV网站| 在线a级毛片免费视频| 污网站在线观看免费| 久久久久亚洲Av片无码v| 永久免费毛片在线播放| 性生大片视频免费观看一级| 亚洲精品成人无码中文毛片不卡| 最近高清中文字幕无吗免费看| 边摸边脱吃奶边高潮视频免费| 亚洲毛片αv无线播放一区| 噼里啪啦电影在线观看免费高清 | 一级特黄色毛片免费看| 久久精品国产亚洲AV香蕉|