Lucene的Directory文件目录操作MMapDirectory等类详解及区别(4.5)

概念

Lucene的Directory是一个抽象类,是针对索引文件目录操作的抽象类,对文件操作都是通过Directory来实现的;Directory的实现类可以分为文件目录内存目录目录的代理类及工具类

文件目录

FSDirectory是文件目录操作的抽象类,其下有三个具体的实现类SimpleFSDirectory,NIOFSDirectory和MMapDirectory。

1、SimpleFSDirectory

SimpleFSDirectory是FSDirectory抽象类的最简单直接的实现,读写操作都使用的是java.io.RandomAccessFile;然而它的并发能力很差,在多个线程针对同一个文件进行读操作时,需要进行同步操作也就是相当于串行操作,通常用NIOFSDirectory和MMapDirectory代替。

2、NIOFSDirectory

NIOFSDirectory顾名思义,它是使用NIO的FileChannel来解决读索引文件并发能力的,该类仅使用FileChannel进行读操作,写操作则是通过FSDirectory的FSIndexOutput实现;值得注意的是,NIOFSDirectory在windows的Sun JRE下有致命的bug,原因是由于FileChannel.read在windows下是同步操作(bug地址:http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6265734),此外如果一个访问该类的线程,在IO阻塞时被interrupt或cancel,将会导致底层的文件描述符被关闭,后续的线程再次访问NIOFSDirectory时将会出现ClosedChannelException异常,此种情况应用SimpleFSDirectory代替。

3、MMapDirectory

FSDirectory抽象类的实现类,读操作通过内存映射进行,写操作则通过FSDirectory的FSIndexOutput来实现;它的主要变化即读操作是基于内存映射的方式把文件load到内存来减少与IO的交互次数,从而提高IO性能;使用该类时要保证用足够的虚拟地址空间。此外当通过IndexInput的close方法进行关闭时,并不会立即关闭底层的文件句柄,只有GC进行资源回收时才会关闭。

文件目录实现类对比

写操作 读操作 特点
SimpleFSDirectory java.io.RandomAccessFile java.io.RandomAccessFile 简单实现,并发能力差
NIOFSDirectory java.nio.FileChannel FSDirectory.FSIndexOutput 并发能力强
MMapDirectory 内存映射 FSDirectory.FSIndexOutput 读取操作基于内存

内存目录

读写操作都在内存中进行的方式。

1、RAMDirectory

常驻内存的Directory实现方式。默认通过SingleInstanceLockFactory(单实例锁工厂)进行锁的实现。该类不适合大量索引的情况。另外也不适用于多线程的情况。在索引数据量大的情况下建议使用MMapDirectory代替。RAMDirectory是Directory抽象类在使用内存作为文件存储的实现类,其主要是将所有的索引文件保存到内存中。这样可以提高效率。但是如果索引文件过大的话,则会导致内存不足,因此,小型的系统推荐使用,如果大型的,索引文件达到G级别上,推荐使用FSDirectory。

2、NRTCachingDirectory

NRTCachingDirectory是针对RAMDirectory封装的代理类,主要用在近实时搜索场景下,NRT就是near-real-time(近实时)的缩写;具体特点是在少量写入索引时,写索引稍微慢,读索引相对比较快。

代理类及工具类

 

1、FileSwitchDirectory

FileSwitchDirectory是lucene的另一种Directory实现类,从名字个就可以理解为文件切换的Directory实现,是针对lucene的不同的索引文件使用不同的Directory .借助FileSwitchDirectory整合不同的Directory实现类的优点于一身。比如MMapDirectory,借助内存映射文件方式提高性能,但又要减少内存切换的可能 ,当索引太大的时候,内存映射也需要不断地切换,这样优点也可能变缺点,而之前的NIOFSDirectory实现java NIO的方式提高高并发性能,但又因高并发也会导致IO过多的影响,所以这次可以借助FileSwitchDirectory发挥他们两的优点。

2、CompoundFileDirectory

用于访问一个组合的数据流。仅适用于读操作。对于同一段内扩展名不同但文件名相同的所有文件合并到一个统一的.cfs文件和一个对应的.cfe文件内。.cfs文件由Header,FileData和FileCount组成。.cfe文件由Header,FileCount,FileName,DataOffset,DataLength组成。.cfs文件中存储着索引的概要信息及组合文件的数目(FileCount)。.cfe文件存储文件目录的条目内容,内容中包括文件数据扇区的起始位置,文件的长度及文件的名称。

3、TrackingDirectoryWrapper

Directory的代理类,用于记录哪些文件被写入和删除。

4、RateLimitedDirectoryWrapper

通过IOContext来限制读写速率的Directory封装类。

猜你喜欢

转载自blog.csdn.net/asdfsadfasdfsa/article/details/82154019