public class Memoizer extends ReaderWrapper
ReaderWrapper implementation which caches the state of the
delegate (including and other ReaderWrapper instances)
after setId(String) has been called.
Initializing a Bio-Formats reader can consume substantial time and memory.
Most of the initialization time is spent in the setId(String) call.
Various factors can impact the performance of this step including the file
size, the amount of metadata in the image and also the file format itself.
With the Memoizer reader wrapper, if the time required to call the
setId(String) method is larger than minimumElapsed, the
initialized reader including all reader wrappers will be cached in a memo
file via saveMemo().
Any subsequent call to setId(String) with a reader decorated by
the Memoizer on the same input file will load the reader from the memo file
using loadMemo() instead of performing a full reader
initialization.
In essence, the speed-up gained from memoization will happen only after the
first initialization of the reader for a particular file.| Modifier and Type | Class and Description |
|---|---|
static interface |
Memoizer.Deser |
static class |
Memoizer.KryoDeser |
private static class |
Memoizer.RandomAccessDeser
Helper implementation that can be used to implement
Memoizer.Deser
classes for libraries working solely with byte arrays. |
| Modifier and Type | Field and Description |
|---|---|
static long |
DEFAULT_MINIMUM_ELAPSED
Default value for
minimumElapsed if none is provided in the
constructor. |
private java.io.File |
directory
Directory where all memo files should be created.
|
private boolean |
doInPlaceCaching
If
true, then all memo files will be created in the same
directory as the original file. |
private boolean |
loadedFromMemo
Whether the
ReaderWrapper.reader instance currently active was loaded from
the memo file during setId(String). |
private static org.slf4j.Logger |
LOGGER
Default
Logger for the memoizer class |
private java.io.File |
memoFile |
private long |
minimumElapsed
Minimum number of milliseconds which must elapse during the call to
setId(java.lang.String) before a memo file will be created. |
private loci.common.Location |
realFile |
private MetadataStore |
replacementMetadataStore
MetadataStore created internally. |
private boolean |
savedToMemo
Whether the
ReaderWrapper.reader instance was saved to a memo file on
setId(String). |
protected Memoizer.Deser |
ser |
private OMEXMLService |
service |
private boolean |
skipLoad |
private boolean |
skipSave |
private java.io.File |
tempFile |
private MetadataStore |
userMetadataStore
MetadataStore set by the caller. |
static java.lang.Integer |
VERSION
Default file version.
|
private boolean |
versionChecking
Boolean specifying whether to invalidate the memo file based upon
mismatched major/minor version numbers.
|
readerCAN_GROUP, CANNOT_GROUP, MUST_GROUP| Constructor and Description |
|---|
Memoizer()
Constructs a memoizer around a new
ImageReader creating memo
files under the same directory as the original file only if the call to
setId(java.lang.String) takes longer than 100L in
milliseconds. |
Memoizer(IFormatReader r)
Constructs a memoizer around the given
IFormatReader creating
memo files under the same directory as the original file only if the
call to setId(java.lang.String) takes longer than
100L in milliseconds. |
Memoizer(IFormatReader r,
long minimumElapsed)
Constructs a memoizer around the given
IFormatReader creating
memo files under the same directory as the original file only if the
call to setId(java.lang.String) takes longer than minimumElapsed in
milliseconds. |
Memoizer(IFormatReader r,
long minimumElapsed,
java.io.File directory)
Constructs a memoizer around the given
IFormatReader creating
memo files under the directory argument including the full path
of the original file only if the call to setId(java.lang.String) takes longer than
minimumElapsed in milliseconds. |
Memoizer(long minimumElapsed)
Constructs a memoizer around a new
ImageReader creating memo
files under the same directory as the original file only if the call to
setId(java.lang.String) takes longer than minimumElapsed in milliseconds. |
Memoizer(long minimumElapsed,
java.io.File directory)
Constructs a memoizer around a new
ImageReader creating memo file
files under the directory argument including the full path of the
original file only if the call to setId(java.lang.String) takes longer than
minimumElapsed in milliseconds. |
| Modifier and Type | Method and Description |
|---|---|
protected void |
cleanup() |
void |
close() |
void |
close(boolean fileOnly)
Closes the currently open file.
|
protected boolean |
deleteQuietly(java.io.File file)
Attempts to delete an existing file, logging at
warn if the deletion returns false or at error
if an exception is thrown.
|
boolean |
generateMemo(java.lang.String file)
Convenience method to generate (or regenerate) the memo file for a given file.
|
protected Memoizer.Deser |
getDeser()
Returns a configured
Kryo instance. |
java.io.File |
getMemoFile(java.lang.String id)
Constructs a
File object from id string. |
MetadataStore |
getMetadataStore()
Retrieves the current metadata store for this reader.
|
protected OMEXMLService |
getService() |
protected IFormatReader |
handleMetadataStore(IFormatReader memo)
Return the
IFormatReader instance that is passed in or null if
it has been invalidated, which will include the instance being closed. |
boolean |
isLoadedFromMemo()
Returns whether the
ReaderWrapper.reader instance currently active was loaded
from the memo file during setId(String). |
boolean |
isSavedToMemo()
Returns whether the
ReaderWrapper.reader instance currently active was saved
to the memo file during setId(String). |
boolean |
isVersionChecking()
Returns whether or not version checking is done based upon major/minor
version numbers.
|
protected boolean |
isWritableDirectory(java.io.File writeDirectory)
Test if the given
File instance is a writable directory. |
private static void |
load(java.lang.String id,
java.io.File tmp,
boolean delete) |
IFormatReader |
loadMemo()
Load a memo file if possible, returning a null if not.
|
static void |
main(java.lang.String[] args) |
boolean |
saveMemo()
Save a reader including all reader wrappers inside a memo file.
|
void |
setId(java.lang.String id)
Sets the current file name.
|
void |
setMetadataStore(MetadataStore store)
Sets the default metadata store for this reader.
|
void |
setVersionChecking(boolean version)
Set whether version checking is done based upon major/minor version
numbers.
|
void |
skipSave(boolean skip)
Set whether a memo file should be saved if a valid file is not present.
|
protected org.perf4j.slf4j.Slf4JStopWatch |
stopWatch() |
boolean |
versionMismatch()
Returns
true if the version of the memo file as returned by
Memoizer.Deser.loadReleaseVersion() and Memoizer.Deser.loadRevision()
do not match the current version as specified by FormatTools.VERSION. |
coreIndexToSeries, duplicate, fileGroupOption, get16BitLookupTable, get8BitLookupTable, getAdvancedSeriesUsedFiles, getAdvancedUsedFiles, getBitsPerPixel, getCoreIndex, getCoreMetadataList, getCurrentFile, getDatasetStructureDescription, getDimensionOrder, getDomains, getEffectiveSizeC, getFormat, getGlobalMetadata, getImageCount, getIndex, getIndex, getMetadataOptions, getMetadataStoreRoot, getMetadataValue, getModuloC, getModuloT, getModuloZ, getNativeDataType, getOptimalTileHeight, getOptimalTileWidth, getPixelType, getPossibleDomains, getReader, getRequiredDirectories, getResolution, getResolutionCount, getRGBChannelCount, getSeries, getSeriesCount, getSeriesMetadata, getSeriesMetadataValue, getSeriesUsedFiles, getSeriesUsedFiles, getSizeC, getSizeT, getSizeX, getSizeY, getSizeZ, getSuffixes, getSupportedMetadataLevels, getThumbSizeX, getThumbSizeY, getUnderlyingReaders, getUsedFiles, getUsedFiles, getZCTCoords, getZCTModuloCoords, hasCompanionFiles, hasFlattenedResolutions, isFalseColor, isGroupFiles, isIndexed, isInterleaved, isInterleaved, isLittleEndian, isMetadataComplete, isMetadataFiltered, isNormalized, isOrderCertain, isOriginalMetadataPopulated, isRGB, isSingleFile, isThisType, isThisType, isThisType, isThisType, isThumbnailSeries, openBytes, openBytes, openBytes, openBytes, openPlane, openThumbBytes, reopenFile, seriesToCoreIndex, setCoreIndex, setFlattenedResolutions, setGroupFiles, setMetadataFiltered, setMetadataOptions, setNormalized, setOriginalMetadataPopulated, setResolution, setSeries, unwrap, unwrap, unwrappublic static final java.lang.Integer VERSION
public static final long DEFAULT_MINIMUM_ELAPSED
minimumElapsed if none is provided in the
constructor.private static final org.slf4j.Logger LOGGER
Logger for the memoizer classprivate final long minimumElapsed
setId(java.lang.String) before a memo file will be created. Default to
DEFAULT_MINIMUM_ELAPSED if not specified via the constructor.private final java.io.File directory
doInPlaceCaching.private boolean doInPlaceCaching
true, then all memo files will be created in the same
directory as the original file.protected transient Memoizer.Deser ser
private transient OMEXMLService service
private loci.common.Location realFile
private java.io.File memoFile
private java.io.File tempFile
private boolean skipLoad
private boolean skipSave
private boolean versionChecking
private boolean loadedFromMemo
ReaderWrapper.reader instance currently active was loaded from
the memo file during setId(String).private boolean savedToMemo
ReaderWrapper.reader instance was saved to a memo file on
setId(String).private MetadataStore userMetadataStore
MetadataStore set by the caller. This value will be held locally
and not set on the ReaderWrapper.reader delegate until the execution
of setId(String). If no value has been set by the caller, then
no special actions are taken during setId(String). If a value
is set, however, we must be careful with attempting to serialize ithandleMetadataStore(IFormatReader)private MetadataStore replacementMetadataStore
MetadataStore created internally.handleMetadataStore(IFormatReader)public Memoizer()
ImageReader creating memo
files under the same directory as the original file only if the call to
setId(java.lang.String) takes longer than 100L in
milliseconds.public Memoizer(long minimumElapsed)
ImageReader creating memo
files under the same directory as the original file only if the call to
setId(java.lang.String) takes longer than minimumElapsed in milliseconds.minimumElapsed - a long specifying the number of milliseconds which
must elapse during the call to setId(java.lang.String) before a memo file
will be created.public Memoizer(long minimumElapsed,
java.io.File directory)
ImageReader creating memo file
files under the directory argument including the full path of the
original file only if the call to setId(java.lang.String) takes longer than
minimumElapsed in milliseconds.minimumElapsed - a long specifying the number of milliseconds which
must elapse during the call to setId(java.lang.String) before a memo file
will be created.directory - a File specifying the directory where all memo
files should be created. If null, disable memoization.public Memoizer(IFormatReader r)
IFormatReader creating
memo files under the same directory as the original file only if the
call to setId(java.lang.String) takes longer than
100L in milliseconds.r - an IFormatReader instancepublic Memoizer(IFormatReader r, long minimumElapsed)
IFormatReader creating
memo files under the same directory as the original file only if the
call to setId(java.lang.String) takes longer than minimumElapsed in
milliseconds.r - an IFormatReader instanceminimumElapsed - a long specifying the number of milliseconds which
must elapse during the call to setId(java.lang.String) before a memo file
will be created.public Memoizer(IFormatReader r, long minimumElapsed, java.io.File directory)
IFormatReader creating
memo files under the directory argument including the full path
of the original file only if the call to setId(java.lang.String) takes longer than
minimumElapsed in milliseconds.r - an IFormatReader instanceminimumElapsed - a long specifying the number of milliseconds which
must elapse during the call to setId(java.lang.String) before a memo file
will be created.directory - a File specifying the directory where all memo
files should be created. If null, disable memoization.public boolean isLoadedFromMemo()
ReaderWrapper.reader instance currently active was loaded
from the memo file during setId(String).true if the reader was loaded from the memo file,
false otherwise.public boolean isSavedToMemo()
ReaderWrapper.reader instance currently active was saved
to the memo file during setId(String).true if the reader was saved to the memo file,
false otherwise.public boolean isVersionChecking()
true if version checking is done based upon
major/minor version numbers, false otherwise.public boolean versionMismatch()
throws java.io.IOException
true if the version of the memo file as returned by
Memoizer.Deser.loadReleaseVersion() and Memoizer.Deser.loadRevision()
do not match the current version as specified by FormatTools.VERSION.java.io.IOExceptionpublic void setVersionChecking(boolean version)
true, then a mismatch between the major/minor version of the
calling code (e.g. 4.4) and the major/minor version saved in the memo
file (e.g. 5.0) will result in the memo file being invalidated.
If false (default), a mismatch in the Git commit hashes will
invalidate the memo file.
This method allows for less strict version checking.version - a boolean specifying whether version checking is done
based upon major/minor version numbers to invalidate the memo filepublic void skipSave(boolean skip)
false (default), then a memo file will be saved. This may
cause an existing memo file to be overwritten.
If true, then a memo file will not be saved. This effectively
makes the current Memoizer read-only.protected void cleanup()
public void close()
throws java.io.IOException
close in interface java.io.Closeableclose in interface java.lang.AutoCloseableclose in class ReaderWrapperjava.io.IOExceptionpublic void close(boolean fileOnly)
throws java.io.IOException
IFormatReaderCloseable.close().close in interface IFormatReaderclose in class ReaderWrapperjava.io.IOExceptionpublic void setId(java.lang.String id)
throws FormatException,
java.io.IOException
IFormatHandlersetId in interface IFormatHandlersetId in class ReaderWrapperFormatExceptionjava.io.IOExceptionpublic void setMetadataStore(MetadataStore store)
IFormatReadersetMetadataStore in interface IFormatReadersetMetadataStore in class ReaderWrapperstore - a metadata store implementation.public MetadataStore getMetadataStore()
IFormatReadernull
metadata store.getMetadataStore in interface IFormatReadergetMetadataStore in class ReaderWrapperprotected boolean deleteQuietly(java.io.File file)
File.delete() or false if
an exception is thrown.protected Memoizer.Deser getDeser()
Kryo instance. This method can be modified
by consumers. The returned instance is not thread-safe.Kryo instance.protected OMEXMLService getService() throws MissingLibraryException
MissingLibraryExceptionprotected org.perf4j.slf4j.Slf4JStopWatch stopWatch()
public java.io.File getMemoFile(java.lang.String id)
File object from id string. This method
can be modified by consumers, but then existing memo files will not be
found.id - the path passed to setId(java.lang.String)File object pointing at the location of the memo fileprotected boolean isWritableDirectory(java.io.File writeDirectory)
File instance is a writable directory.writeDirectory - a possible writable directoryFile is indeed a writable directorypublic IFormatReader loadMemo() throws java.io.IOException, FormatException
java.io.IOExceptionFormatExceptionpublic boolean saveMemo()
protected IFormatReader handleMetadataStore(IFormatReader memo) throws MissingLibraryException
IFormatReader instance that is passed in or null if
it has been invalidated, which will include the instance being closed.
MetadataStore
implementation is passed in when no memo file exists, then a replacement
MetadataStore will be created and set on the ReaderWrapper.reader
delegate before calling ReaderWrapper.setId(String). This stack
will then be serialized, before any values are copied into
userMetadataStore.
MetadataStore
implementation is set before calling setId(String) then ...
MissingLibraryExceptionpublic boolean generateMemo(java.lang.String file)
throws java.io.IOException
file - the file for which to generate a memo filejava.io.IOExceptionpublic static void main(java.lang.String[] args)
throws java.lang.Exception
java.lang.Exceptionprivate static void load(java.lang.String id,
java.io.File tmp,
boolean delete)
throws java.lang.Exception
java.lang.ExceptionCopyright © 2021 Open Microscopy Environment