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.
|
reader
CAN_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, unwrap
public 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.IOException
public 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.Closeable
close
in interface java.lang.AutoCloseable
close
in class ReaderWrapper
java.io.IOException
public void close(boolean fileOnly) throws java.io.IOException
IFormatReader
Closeable.close()
.close
in interface IFormatReader
close
in class ReaderWrapper
java.io.IOException
public void setId(java.lang.String id) throws FormatException, java.io.IOException
IFormatHandler
setId
in interface IFormatHandler
setId
in class ReaderWrapper
FormatException
java.io.IOException
public void setMetadataStore(MetadataStore store)
IFormatReader
setMetadataStore
in interface IFormatReader
setMetadataStore
in class ReaderWrapper
store
- a metadata store implementation.public MetadataStore getMetadataStore()
IFormatReader
null
metadata store.getMetadataStore
in interface IFormatReader
getMetadataStore
in class ReaderWrapper
protected 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
MissingLibraryException
protected 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.IOException
FormatException
public 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 ...
MissingLibraryException
public boolean generateMemo(java.lang.String file) throws java.io.IOException
file
- the file for which to generate a memo filejava.io.IOException
public static void main(java.lang.String[] args) throws java.lang.Exception
java.lang.Exception
private static void load(java.lang.String id, java.io.File tmp, boolean delete) throws java.lang.Exception
java.lang.Exception
Copyright © 2022 Open Microscopy Environment