Skip to content

Commit

Permalink
Merge pull request #191 from scifio/available-memory
Browse files Browse the repository at this point in the history
Fix the estimation of the remaining free memory
  • Loading branch information
dscho committed Jun 9, 2014
2 parents 22e801d + a2131bc commit 5b0c5cf
Show file tree
Hide file tree
Showing 5 changed files with 69 additions and 5 deletions.
4 changes: 2 additions & 2 deletions scifio/src/main/java/io/scif/filters/PlaneSeparator.java
Expand Up @@ -39,6 +39,7 @@
import io.scif.io.RandomAccessInputStream;
import io.scif.util.FormatTools;
import io.scif.util.ImageTools;
import io.scif.util.MemoryTools;

import java.io.File;
import java.io.IOException;
Expand Down Expand Up @@ -262,8 +263,7 @@ public Plane openPlane(final int imageIndex, final long planeIndex,
// available memory, we will need to split it into strips (of the last
// planar axis)

final Runtime rt = Runtime.getRuntime();
final long availableMemory = rt.freeMemory();
final long availableMemory = MemoryTools.totalAvailableMemory() / 16;
final long planeSize = meta.get(imageIndex).getPlaneSize();
// If we make strips, they will be of the Y axis
final long h = lengths[meta.get(imageIndex).getAxisIndex(Axes.Y)];
Expand Down
Expand Up @@ -35,6 +35,7 @@
import io.scif.config.SCIFIOConfig.ImgMode;
import io.scif.img.cell.SCIFIOCellImgFactory;
import io.scif.util.FormatTools;
import io.scif.util.MemoryTools;
import net.imglib2.exception.IncompatibleTypeException;
import net.imglib2.img.ImgFactory;
import net.imglib2.img.array.ArrayImgFactory;
Expand Down Expand Up @@ -81,7 +82,7 @@ public <T extends NativeType<T>> ImgFactory<T> createFactory(
final long maxSize = DataTools.safeMultiply64(2, 1024, 1024, 1024);

final long availableMem =
(long) (Runtime.getRuntime().freeMemory() * MEMORY_THRESHOLD);
(long) (MemoryTools.totalAvailableMemory() * MEMORY_THRESHOLD);
long datasetSize = m.getDatasetSize();

// check for overflow
Expand Down
61 changes: 61 additions & 0 deletions scifio/src/main/java/io/scif/util/MemoryTools.java
@@ -0,0 +1,61 @@
/*
* #%L
* SCIFIO library for reading and converting scientific file formats.
* %%
* Copyright (C) 2011 - 2014 Board of Regents of the University of
* Wisconsin-Madison
* %%
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
* #L%
*/

package io.scif.util;

/**
* A utility class with convenience methods to obtain information about the
* heap.
*
* @author Johannes Schindelin
*/
public class MemoryTools {

/**
* Returns the total amount of remaining memory.
* <p>
* Slightly tricky: totalMemory() returns the amount of RAM claimed currently,
* not the maximum amount Java will claim when asked (that is maxMemory()
* instead). Likewise, freeMemory() returns the number of free bytes <i>in the
* currently claimed chunk of RAM</i>, not the number of bytes still available
* for Java.
* <p>
* </p>
* Therefore, a little arithmetic is required to obtain the real number of
* available bytes for us to use. </p>
*
* @return the amount of memory available for data
*/
public static long totalAvailableMemory() {
final Runtime rt = Runtime.getRuntime();
return rt.freeMemory() + rt.maxMemory() - rt.totalMemory();
}

}
Expand Up @@ -45,6 +45,7 @@
import io.scif.img.cell.cache.CacheService;
import io.scif.img.cell.loaders.ByteArrayLoader;
import io.scif.img.cell.loaders.SCIFIOArrayLoader;
import io.scif.util.MemoryTools;

import java.io.IOException;
import java.lang.ref.WeakReference;
Expand Down Expand Up @@ -496,7 +497,7 @@ private void enableCells(final boolean enabled, final SCIFIOCell<?>... cells)
*/
private void clearMem() {
if (arraySize == -1) {
arraySize = Runtime.getRuntime().freeMemory();
arraySize = MemoryTools.totalAvailableMemory();
if (arraySize > Integer.MAX_VALUE) {
arraySize = Integer.MAX_VALUE;
}
Expand Down
Expand Up @@ -36,6 +36,7 @@
import io.scif.img.IO;
import io.scif.img.SCIFIOImgPlus;
import io.scif.img.cell.SCIFIOCellImg;
import io.scif.util.MemoryTools;

import java.lang.ref.WeakReference;

Expand Down Expand Up @@ -84,7 +85,7 @@ public void testReaderCleanup() {
// new WeakReference<Metadata>(((SCIFIOCellImg) img.getImg()).reader()
// .getMetadata());
// img = null;
// long arraySize = Runtime.getRuntime().freeMemory();
// long arraySize = MemoryTools.totalAvailableMemory();
// if (arraySize > Integer.MAX_VALUE) {
// arraySize = Integer.MAX_VALUE;
// }
Expand Down

0 comments on commit 5b0c5cf

Please sign in to comment.