From 666600d3bd5417bd5f3697951715504dffd8c3c2 Mon Sep 17 00:00:00 2001 From: Nicolas Chiaruttini Date: Sat, 14 May 2022 16:40:44 +0200 Subject: [PATCH 1/2] Adds CacheOverrider interface and implementations in: * Hdf5ImageLoader * N5ImageLoader * ImarisImageLoader * RemoteImageLoader Allows finer control over the amount of RAM that will be used before discarding loaded cells. --- src/main/java/bdv/cache/CacheOverrider.java | 14 ++++++++++++++ src/main/java/bdv/img/hdf5/Hdf5ImageLoader.java | 17 ++++++++++++++++- .../java/bdv/img/imaris/ImarisImageLoader.java | 14 +++++++++++++- src/main/java/bdv/img/n5/N5ImageLoader.java | 17 ++++++++++++++++- .../java/bdv/img/remote/RemoteImageLoader.java | 14 +++++++++++++- 5 files changed, 72 insertions(+), 4 deletions(-) create mode 100644 src/main/java/bdv/cache/CacheOverrider.java diff --git a/src/main/java/bdv/cache/CacheOverrider.java b/src/main/java/bdv/cache/CacheOverrider.java new file mode 100644 index 00000000..bd0d3d7f --- /dev/null +++ b/src/main/java/bdv/cache/CacheOverrider.java @@ -0,0 +1,14 @@ +package bdv.cache; + +import bdv.img.cache.VolatileGlobalCellCache; + +/** + * Allows to override the {@link bdv.img.cache.VolatileGlobalCellCache} in + * ImageLoader(s) which implement this interface. + */ + +public interface CacheOverrider { + + void setCache(VolatileGlobalCellCache cache); + +} diff --git a/src/main/java/bdv/img/hdf5/Hdf5ImageLoader.java b/src/main/java/bdv/img/hdf5/Hdf5ImageLoader.java index 33e576b3..db2df35f 100644 --- a/src/main/java/bdv/img/hdf5/Hdf5ImageLoader.java +++ b/src/main/java/bdv/img/hdf5/Hdf5ImageLoader.java @@ -30,6 +30,7 @@ import bdv.AbstractViewerSetupImgLoader; import bdv.ViewerImgLoader; +import bdv.cache.CacheOverrider; import bdv.cache.SharedQueue; import bdv.img.cache.VolatileGlobalCellCache; import bdv.util.ConstantRandomAccessible; @@ -76,7 +77,7 @@ import static bdv.img.hdf5.Util.getResolutionsPath; import static bdv.img.hdf5.Util.getSubdivisionsPath; -public class Hdf5ImageLoader implements ViewerImgLoader, MultiResolutionImgLoader +public class Hdf5ImageLoader implements ViewerImgLoader, MultiResolutionImgLoader, CacheOverrider { protected File hdf5File; @@ -311,6 +312,20 @@ public VolatileGlobalCellCache getCacheControl() return cache; } + @Override + public synchronized void setCache(VolatileGlobalCellCache cache) { + if ( isOpen ) + { + if ( !isOpen ) + return; + if ( createdSharedQueue != null ) + createdSharedQueue.shutdown(); + cache.clearCache(); + createdSharedQueue = null; + } + this.cache = cache; + } + public Hdf5VolatileShortArrayLoader getShortArrayLoader() { open(); diff --git a/src/main/java/bdv/img/imaris/ImarisImageLoader.java b/src/main/java/bdv/img/imaris/ImarisImageLoader.java index b081ed40..ad1600c7 100644 --- a/src/main/java/bdv/img/imaris/ImarisImageLoader.java +++ b/src/main/java/bdv/img/imaris/ImarisImageLoader.java @@ -28,6 +28,7 @@ */ package bdv.img.imaris; +import bdv.cache.CacheOverrider; import bdv.img.hdf5.Util; import bdv.util.MipmapTransforms; import ch.systemsx.cisd.hdf5.HDF5DataClass; @@ -65,7 +66,7 @@ import net.imglib2.type.numeric.integer.UnsignedShortType; import net.imglib2.type.volatiles.VolatileUnsignedShortType; -public class ImarisImageLoader< T extends NativeType< T >, V extends Volatile< T > & NativeType< V > , A extends VolatileAccess > implements ViewerImgLoader +public class ImarisImageLoader< T extends NativeType< T >, V extends Volatile< T > & NativeType< V > , A extends VolatileAccess > implements ViewerImgLoader, CacheOverrider { private IHDF5Access hdf5Access; @@ -285,6 +286,17 @@ public CacheControl getCacheControl() return cache; } + @Override + public synchronized void setCache(VolatileGlobalCellCache cache) { + if ( isOpen ) + { + if ( !isOpen ) + return; + cache.clearCache(); + } + this.cache = cache; + } + @Override public SetupImgLoader getSetupImgLoader( final int setupId ) { diff --git a/src/main/java/bdv/img/n5/N5ImageLoader.java b/src/main/java/bdv/img/n5/N5ImageLoader.java index 89174b06..a99fa991 100644 --- a/src/main/java/bdv/img/n5/N5ImageLoader.java +++ b/src/main/java/bdv/img/n5/N5ImageLoader.java @@ -31,6 +31,7 @@ import bdv.AbstractViewerSetupImgLoader; import bdv.ViewerImgLoader; import bdv.cache.CacheControl; +import bdv.cache.CacheOverrider; import bdv.cache.SharedQueue; import bdv.img.cache.SimpleCacheArrayLoader; import bdv.img.cache.VolatileGlobalCellCache; @@ -100,7 +101,7 @@ import static bdv.img.n5.BdvN5Format.DOWNSAMPLING_FACTORS_KEY; import static bdv.img.n5.BdvN5Format.getPathName; -public class N5ImageLoader implements ViewerImgLoader, MultiResolutionImgLoader +public class N5ImageLoader implements ViewerImgLoader, MultiResolutionImgLoader, CacheOverrider { private final File n5File; @@ -186,6 +187,20 @@ private void open() } } + @Override + public synchronized void setCache(VolatileGlobalCellCache cache) { + if ( isOpen ) + { + if ( !isOpen ) + return; + if ( createdSharedQueue != null ) + createdSharedQueue.shutdown(); + cache.clearCache(); + createdSharedQueue = null; + } + this.cache = cache; + } + /** * Clear the cache. Images that were obtained from * this loader before {@link #close()} will stop working. Requesting images diff --git a/src/main/java/bdv/img/remote/RemoteImageLoader.java b/src/main/java/bdv/img/remote/RemoteImageLoader.java index 59af056b..10b448b1 100644 --- a/src/main/java/bdv/img/remote/RemoteImageLoader.java +++ b/src/main/java/bdv/img/remote/RemoteImageLoader.java @@ -33,6 +33,7 @@ import java.net.URL; import java.util.HashMap; +import bdv.cache.CacheOverrider; import com.google.gson.GsonBuilder; import bdv.AbstractViewerSetupImgLoader; @@ -56,7 +57,7 @@ import net.imglib2.util.IntervalIndexer; import net.imglib2.view.Views; -public class RemoteImageLoader implements ViewerImgLoader +public class RemoteImageLoader implements ViewerImgLoader, CacheOverrider { protected String baseUrl; @@ -139,6 +140,17 @@ public VolatileGlobalCellCache getCacheControl() return cache; } + @Override + public synchronized void setCache(VolatileGlobalCellCache cache) { + if ( isOpen ) + { + if ( !isOpen ) + return; + cache.clearCache(); + } + this.cache = cache; + } + public MipmapInfo getMipmapInfo( final int setupId ) { tryopen(); From 7d983a3b11e40ea30e31ea37fcbf933ef5c14236 Mon Sep 17 00:00:00 2001 From: Nicolas Chiaruttini Date: Sat, 14 May 2022 16:51:23 +0200 Subject: [PATCH 2/2] Adds a constructor to VolatileGlobalCellCache with a backing cache argument. Allows to use different cache implementations (BoundedSoftRefLoaderCache for instance). --- .../bdv/img/cache/VolatileGlobalCellCache.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/main/java/bdv/img/cache/VolatileGlobalCellCache.java b/src/main/java/bdv/img/cache/VolatileGlobalCellCache.java index 0a122514..271c552c 100644 --- a/src/main/java/bdv/img/cache/VolatileGlobalCellCache.java +++ b/src/main/java/bdv/img/cache/VolatileGlobalCellCache.java @@ -127,6 +127,21 @@ public VolatileGlobalCellCache( final int maxNumLevels, final int numFetcherThre backingCache = new SoftRefLoaderCache<>(); } + /** + * Create a new global cache with the specified fetch queue. (It is the + * callers responsibility to create fetcher threads that serve the queue.) + * and the backing cache. + * + * @param queue + * queue to which asynchronous data loading jobs are submitted + * @param backingCache cache used to stored the cells + */ + public VolatileGlobalCellCache( final BlockingFetchQueues< Callable< ? > > queue, final LoaderCache< Key, Cell< ? > > backingCache) + { + this.queue = queue; + this.backingCache = backingCache; + } + /** * Create a new global cache with the specified fetch queue. (It is the * callers responsibility to create fetcher threads that serve the queue.)