Class MMapDirectory
- java.lang.Object
-
- org.apache.lucene.store.Directory
-
- org.apache.lucene.store.BaseDirectory
-
- org.apache.lucene.store.FSDirectory
-
- org.apache.lucene.store.MMapDirectory
-
- All Implemented Interfaces:
java.io.Closeable,java.lang.AutoCloseable
public class MMapDirectory extends FSDirectory
File-basedDirectoryimplementation that uses mmap for reading, andFSDirectory.FSIndexOutputfor writing.NOTE: memory mapping uses up a portion of the virtual memory address space in your process equal to the size of the file being mapped. Before using this class, be sure your have plenty of virtual address space, e.g. by using a 64 bit JRE, or a 32 bit JRE with indexes that are guaranteed to fit within the address space. On 32 bit platforms also consult
MMapDirectory(File, LockFactory, int)if you have problems with mmap failing because of fragmented address space. If you get an OutOfMemoryException, it is recommended to reduce the chunk size, until it works.Due to this bug in Sun's JRE, MMapDirectory's
IndexInput.close()is unable to close the underlying OS file handle. Only when GC finally collects the underlying objects, which could be quite some time later, will the file handle be closed.This will consume additional transient disk usage: on Windows, attempts to delete or overwrite the files will result in an exception; on other platforms, which typically have a "delete on last close" semantics, while such operations will succeed, the bytes are still consuming space on disk. For many applications this limitation is not a problem (e.g. if you have plenty of disk space, and you don't rely on overwriting files on Windows) but it's still an important limitation to be aware of.
This class supplies the workaround mentioned in the bug report (see
setUseUnmap(boolean)), which may fail on non-Sun JVMs. It forcefully unmaps the buffer on close by using an undocumented internal cleanup functionality.UNMAP_SUPPORTEDistrue, if the workaround can be enabled (with no guarantees).NOTE: Accessing this class either directly or indirectly from a thread while it's interrupted can close the underlying channel immediately if at the same time the thread is blocked on IO. The channel will remain closed and subsequent access to
MMapDirectorywill throw aClosedChannelException.
-
-
Nested Class Summary
-
Nested classes/interfaces inherited from class org.apache.lucene.store.Directory
Directory.IndexInputSlicer
-
-
Field Summary
Fields Modifier and Type Field Description static intDEFAULT_MAX_BUFFDefault max chunk size.static booleanUNMAP_SUPPORTEDtrue, if this platform supports unmapping mmapped files.-
Fields inherited from class org.apache.lucene.store.FSDirectory
DEFAULT_READ_CHUNK_SIZE
-
-
Constructor Summary
Constructors Constructor Description MMapDirectory(java.io.File path)Create a new MMapDirectory for the named location andNativeFSLockFactory.MMapDirectory(java.io.File path, LockFactory lockFactory)Create a new MMapDirectory for the named location.MMapDirectory(java.io.File path, LockFactory lockFactory, int maxChunkSize)Create a new MMapDirectory for the named location, specifying the maximum chunk size used for memory mapping.
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description Directory.IndexInputSlicercreateSlicer(java.lang.String name, IOContext context)Creates anDirectory.IndexInputSlicerfor the given file name.intgetMaxChunkSize()Returns the current mmap chunk size.booleangetUseUnmap()Returnstrue, if the unmap workaround is enabled.IndexInputopenInput(java.lang.String name, IOContext context)Creates an IndexInput for the file with the given name.voidsetUseUnmap(boolean useUnmapHack)This method enables the workaround for unmapping the buffers from address space after closingIndexInput, that is mentioned in the bug report.-
Methods inherited from class org.apache.lucene.store.FSDirectory
close, createOutput, deleteFile, fileExists, fileLength, getDirectory, getLockID, getReadChunkSize, listAll, listAll, open, open, setLockFactory, setReadChunkSize, sync, toString
-
Methods inherited from class org.apache.lucene.store.BaseDirectory
clearLock, getLockFactory, makeLock
-
-
-
-
Field Detail
-
DEFAULT_MAX_BUFF
public static final int DEFAULT_MAX_BUFF
Default max chunk size.- See Also:
MMapDirectory(File, LockFactory, int)
-
UNMAP_SUPPORTED
public static final boolean UNMAP_SUPPORTED
true, if this platform supports unmapping mmapped files.
-
-
Constructor Detail
-
MMapDirectory
public MMapDirectory(java.io.File path, LockFactory lockFactory) throws java.io.IOExceptionCreate a new MMapDirectory for the named location.- Parameters:
path- the path of the directorylockFactory- the lock factory to use, or null for the default (NativeFSLockFactory);- Throws:
java.io.IOException- if there is a low-level I/O error
-
MMapDirectory
public MMapDirectory(java.io.File path) throws java.io.IOExceptionCreate a new MMapDirectory for the named location andNativeFSLockFactory.- Parameters:
path- the path of the directory- Throws:
java.io.IOException- if there is a low-level I/O error
-
MMapDirectory
public MMapDirectory(java.io.File path, LockFactory lockFactory, int maxChunkSize) throws java.io.IOExceptionCreate a new MMapDirectory for the named location, specifying the maximum chunk size used for memory mapping.- Parameters:
path- the path of the directorylockFactory- the lock factory to use, or null for the default (NativeFSLockFactory);maxChunkSize- maximum chunk size (default is 1 GiBytes for 64 bit JVMs and 256 MiBytes for 32 bit JVMs) used for memory mapping.Especially on 32 bit platform, the address space can be very fragmented, so large index files cannot be mapped. Using a lower chunk size makes the directory implementation a little bit slower (as the correct chunk may be resolved on lots of seeks) but the chance is higher that mmap does not fail. On 64 bit Java platforms, this parameter should always be
1 << 30, as the address space is big enough.Please note: The chunk size is always rounded down to a power of 2.
- Throws:
java.io.IOException- if there is a low-level I/O error
-
-
Method Detail
-
setUseUnmap
public void setUseUnmap(boolean useUnmapHack)
This method enables the workaround for unmapping the buffers from address space after closingIndexInput, that is mentioned in the bug report. This hack may fail on non-Sun JVMs. It forcefully unmaps the buffer on close by using an undocumented internal cleanup functionality.NOTE: Enabling this is completely unsupported by Java and may lead to JVM crashes if
IndexInputis closed while another thread is still accessing it (SIGSEGV).- Throws:
java.lang.IllegalArgumentException- ifUNMAP_SUPPORTEDisfalseand the workaround cannot be enabled.
-
getUseUnmap
public boolean getUseUnmap()
Returnstrue, if the unmap workaround is enabled.- See Also:
setUseUnmap(boolean)
-
getMaxChunkSize
public final int getMaxChunkSize()
Returns the current mmap chunk size.- See Also:
MMapDirectory(File, LockFactory, int)
-
openInput
public IndexInput openInput(java.lang.String name, IOContext context) throws java.io.IOException
Creates an IndexInput for the file with the given name.
-
createSlicer
public Directory.IndexInputSlicer createSlicer(java.lang.String name, IOContext context) throws java.io.IOException
Description copied from class:DirectoryCreates anDirectory.IndexInputSlicerfor the given file name. IndexInputSlicer allows otherDirectoryimplementations to efficiently open one or more slicedIndexInputinstances from a single file handle. The underlying file handle is kept open until theDirectory.IndexInputSliceris closed.- Must throw
FileNotFoundExceptionif the file does not exist (notjava.nio.file.NoSuchFileExceptionof Java 7).- Overrides:
createSlicerin classDirectory- Throws:
java.io.IOException- if anIOExceptionoccurs
- Must throw
-
-