[转]FileSwitchDirectory实现原理与应用

2019-03-27 01:02|来源: 网路

 转至http://blog.csdn.net/duck_genuine/article/details/8006134

FileSwitchDirectory实现原理与应用 

FileSwitchDirectory是lucene的另一种Directory实现类,从名字个就可以理解为文件切换的Directory实现,

的确是针对lucene的不同的索引文件使用不同的Directory .借助FileSwitchDirectory整合不同的Directory实现类的优点于一身。

比如MMapDirectory,借助内存映射文件方式提高性能,但又要减少内存切换的可能 ,当索引太大的时候,内存映射也需要不断地切换,这样优点也可能变缺点,而之前的NIOFSDirectory实现java NIO的方式提高高并发性能,但又因高并发也会导致IO过多的影响,所以这次可以借助FileSwitchDirectory发挥他们两的优点。

 

 

MMapDirectory与NIOFSDirectory的实现差别。

NIOFSDirectory----只是使用了直接内存读取文件缓存方式 

 

@Override
    protected void newBuffer(byte[] newBuffer) {
      super.newBuffer(newBuffer);
      byteBuf = ByteBuffer.wrap(newBuffer);
    }

MMapDirectory------使用MMap技术映射文件,默认会映射1G的内存(64位)或者256m(32位系统))

 

MMapDiretory就是将文件映射到内存中。。使用的是MMap技术
 this.buffers[bufNr] = rafc.map(MapMode.READ_ONLY, bufferStart, bufSize);

 

 

首先将索引目录里占比例比较小的文件使用MMapDirectory,这样几乎可以全部映射到内存里了。。而占有大比例的文档存储文件交由于NIOFSDirectory方式读取。

这个结合不错呀。。

 

FileSwitchDirectory实现代码解析

 

FileSwitchDirectory的代码很简单,因为可以理解为它就是一个Dao的入口也是个控制器,所以它并没有具体的文件操纵实现。

先了解它的构造是:

 

[java]   view plain copy
  1. public FileSwitchDirectory(Set<String> primaryExtensions, Directory primaryDir, Directory secondaryDir, boolean doClose) {  
  2.   this.primaryExtensions = primaryExtensions;  
  3.   this.primaryDir = primaryDir;  
  4.   this.secondaryDir = secondaryDir;  
  5.   this.doClose = doClose;  
  6.   this.lockFactory = primaryDir.getLockFactory();  
  7. }  


首先是文件后缀的集合参数

 

主要的Directory

次要的Directory

是否关闭的时候调用

 

所以都是调用对应的Directory获得IndexInput 与IndexOuput

 

[java]   view plain copy
  1. @Override  
  2.   public IndexInput openInput(String name) throws IOException {  
  3.     return getDirectory(name).openInput(name);  
  4.   }  

 

[java]   view plain copy
  1. @Override  
  2.  public IndexOutput createOutput(String name) throws IOException {  
  3.    return getDirectory(name).createOutput(name);  
  4.  }  

 

 

通过文件名字取到对应的Directory

[java]   view plain copy
  1. private Directory getDirectory(String name) {  
  2.   String ext = getExtension(name);  
  3.   if (primaryExtensions.contains(ext)) {  
  4.     return primaryDir;  
  5.   } else {  
  6.     return secondaryDir;  
  7.   }  
  8. }  



solr使用的DirectoryFactory实现

 

 

 

[java]   view plain copy
  1. /** 
  2.  *  
  3.  *  
  4.  * 支持某些后缀文件不作映射优化,比如去掉fdt,fdx 
  5.  *  
  6.  *  
  7.  *  
  8.  *    
  9.  <directoryFactory class="solr.MMapDirectoryFactoryExt"> 
  10.     <str name="unmap">true</str> 
  11.     <lst name="filetypes"> 
  12.        <bool name="fdt">false</bool> 
  13.        <bool name="fdx">false</bool> 
  14.    </lst> 
  15.  </directoryFactory> 
  16.  * 
  17.  */  
  18. public class MMapDirectoryFactoryExt extends DirectoryFactory {  
  19.     // filetypes不作映射  
  20.     private Set<String> nonMappedFiles = new HashSet<String>();  
  21.     // 是否使用不映射选择  
  22.     private Boolean useUnmapHack = false;  
  23.   
  24.     public Directory open(String path) throws IOException {  
  25.         MMapDirectory mmapDir = new MMapDirectory(new File(path));  
  26.         mmapDir.setUseUnmap(useUnmapHack);  
  27.         return new FileSwitchDirectory(nonMappedFiles, mmapDir, FSDirectory.open(new File(path)), true);  
  28.     }  
  29.   
  30.     public void init(NamedList args) {  
  31.         Object unmap, namedlist;  
  32.         nonMappedFiles = new HashSet<String>();  
  33.         if ((unmap = args.get("unmap")) instanceof Boolean)  
  34.             useUnmapHack = (Boolean) unmap;  
  35.         if ((namedlist = args.get("filetypes")) instanceof NamedList) {  
  36.             NamedList filetypes = (NamedList) namedlist;  
  37.             for (String type : IndexFileNames.INDEX_EXTENSIONS) {  
  38.                 Object mapped = filetypes.get(type);  
  39.                 if (Boolean.FALSE.equals(mapped))  
  40.                     nonMappedFiles.add(type);  
  41.             }  
  42.         }  
  43.     }  
  44. }  



 

solrconfig.xml上的配置,使用于新的DirectoryFactory

 

 

[html]   view plain copy
  1. <directoryFactory class="solr.MMapDirectoryFactory">  
  2. <str name="unmap">true</str>  
  3. <lst name="filetypes">  
  4. <bool name="fdt">false</bool>  
  5. <bool name="tii">false</bool>  
  6. </lst>  
  7. </directoryFactory>  

 

 

线上的索引文件大小:

7.3G    ./_y8b.fdt

201M    ./_y8b.fdx

4.0K    ./_y8b.fnm

1.8G    ./_y8b.frq

76M     ./_y8b.nrm

537M    ./_y8b.prx

7.1M    ./_y8b.tii

571M    ./_y8b.tis

4.0K    ./segments.gen

4.0K    ./segments_1p

 

 

由于tii文件会加载到内存,所以这个不须要映射,fdt文件太大,主要是正向存储的数据,可以使用NiOFSDirectory方式

还有一个文件frq文件好大,这个也是需要考虑的。

 

 

[java]   view plain copy
  1. public final void setMaxChunkSize(final int maxChunkSize) {  
  2.   if (maxChunkSize <= 0)  
  3.     throw new IllegalArgumentException("Maximum chunk size for mmap must be >0");  
  4.   //System.out.println("Requested chunk size: "+maxChunkSize);  
  5.   this.chunkSizePower = 31 - Integer.numberOfLeadingZeros(maxChunkSize);  
  6.   assert this.chunkSizePower >= 0 && this.chunkSizePower <= 30;  
  7.   //System.out.println("Got chunk size: "+getMaxChunkSize());  
  8. }  


从上面的代码可以看出,最大也只能是1G大小。。。杯具。。


转自:http://www.cnblogs.com/wood-lin/p/3332296

相关问答

更多
  • 编译原理方面比较好的书有三本,分别是龙书、虎书、鲸书, 这三本书是编译原理方面很权威的三本书,以动物命名是因为他们三本的封面上分别印了这三种动物。 这三本书的全名如下: 1.龙书(Dragon book) 书名是Compilers: Principles,Techniques,and Tools 2.鲸书(Whale book) 书名是:Advanced Compiler Design and Implementation 3.虎书(Tiger book) 书名是:Modern Compiler Imple ...
  • 【水翼船工作原理】   在流体中,流速越大的位置,压强越小。当船在水中高速航行时,水翼船的水翼上表面凸起,他与船体间的水流速度大,压强小。下表面的水流速度小,压强大。因此在水翼的上、下表面存在向上的压力(压强)差,上方压强小于下方压强,产生一个合压强,使其产生一个向上的合力。所以船体被抬高了。从而大大减少水的阻力增加了航行速度。 【水翼船】   水翼船(Hydrofoil)是一种高速船。船身底部有支架,装上水翼。当船的速度逐渐增加,水翼提供的浮力会把船身抬离水面(称为水翼飞航或水翼航行, Foilborne ...
  • 、UPS及其工作原理简介 UPS是英文Uninterruptible Power Supply的缩写,意为“不间断供电电源”,是一种含有储能装置(常见的是蓄电池),以逆变器为主要组成部分的恒压恒频的不间断电源,它可以解决现有电力的断电、低电压、高电压、突波、杂讯等现象,使计算机系统运行更加安全可靠。现在已经被广泛应用计算机、交通、银行、证券、通信、医疗、工业控制等行业,并且正在迅速地走入家庭。 下面,让我们先简单地了解一下UPS的工作原理。 当我们没有使用UPS的时候,PC机、打印机等终端设备 ...
  • 操作系统原理[2022-06-23]

    操作系统理论研究者有时把操作系统分成四大部分:   驱动程序- 最底层的、直接控制和监视各类硬件的部分,它们的职责是隐藏硬件的具体细节,并向其他部分提供一个抽象的、通用的接口。   内核- 操作系统之最内核部分,通常运行在最高特权级,负责提供基础性、结构性的功能。   支承库- (亦作“接口库”)是一系列特殊的程序库,它们指责在于把系统所提供的基本服务包装成应用程序所能够使用的编程接口(API),是最靠近应用程序的部分。例如,GNU C运行期库就属于此类,它把各种操作系统的内部编程接口包装成ANSI C和P ...
  • ipMonitor是一个成熟的网络监视解决方案,允许网络管理者、web站点管理者以及Internet服务提供者监视Internet、企业局域网、TCP/IP LAN上的设备,一旦出现问题,可以通过声音报警、发送消息、e-mail或者第三方的软件收到警告。这是一款功能强大的个人监视产品,花费费用少、操作简单、覆盖范围广。 IpMonitor可以运行在多种Windows操作系统上(XP,2000和2003),它监视的元素包括网络设备、应用、数据库和服务器等。 它能够识别并监视Windows服务器(NT,XP,2 ...
  • 雷达原理详解[2022-12-30]

    雷达(radar)原是“无线电探测与定位”的英文缩写。雷达的基本任务是探测感兴趣的目标,测定有关目标的距离、方问、速度等状态参数。雷达主要由天线、发射机、接收机(包括信号处理机)和显示器等部分组成。   雷达发射机产生足够的电磁能量,经过收发转换开关传送给天线。天线将这些电磁能量辐射至大气中,集中在某一个很窄的方向上形成波束,向前传播。电磁波遇到波束内的目标后,将沿着各个方向产生反射,其中的一部分电磁能量反射回雷达的方向,被雷达天线获取。天线获取的能量经过收发转换开关送到接收机,形成雷达的回波信号。由于在传 ...
  • 《C#高级编程》系列不错,里面有介绍.NET程序的编译原理。当然,也涉及了一些Java、C++、VB等的编译原理,并对它们作了比较,揭示了它们的优缺点。
  • 不一样! 人存原理   是霍金在书中提到了“人存原理”这个概念,其释义为:我们看到的宇宙之所以是这个样子, 那是因为我们的存在。科学工作的一切活动如果脱离了人的存在,就不会有任何意义可言。 人存原理告诉我们,我们对宇宙的认识和描述,都带有我们人类特有的认识能力。我们之所以看到宇宙是这个样子。是因为它如果不是这样的话,我们就不会在这里去观察它。   粗略的讲,人存原理是讲,我们看到的宇宙是这种样子,至少在部分上是因为我们的存在。从整体外观上看,刚好和完全可预见的统一理论的梦想正相反。在同一理论中自然定律是完备 ...
  • http://www.525web.com.cn/knowledge/baidu-promotion-138.htm http://www.ilib.cn/Periodical.Articles/jsjgcyyy/2002/11/jsjgcyyy200211038.html http://www.yko2.com/ecms/article/net/2006-08-04/10.html http://hmingo.bokee.com/