From 778aa3d82189970a5b397db6275452be2fcc562d Mon Sep 17 00:00:00 2001 From: brinn <brinn> Date: Mon, 22 Aug 2011 17:34:08 +0000 Subject: [PATCH] fix: very slow operation of HDF5ContainerReader due to inappropriate buffer size of IOUtils.copyLarge() SVN: 22583 --- .../cisd/common/hdf5/HDF5ContainerReader.java | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/common/source/java/ch/systemsx/cisd/common/hdf5/HDF5ContainerReader.java b/common/source/java/ch/systemsx/cisd/common/hdf5/HDF5ContainerReader.java index fe28c5f90f8..4fbd0cff244 100644 --- a/common/source/java/ch/systemsx/cisd/common/hdf5/HDF5ContainerReader.java +++ b/common/source/java/ch/systemsx/cisd/common/hdf5/HDF5ContainerReader.java @@ -22,8 +22,6 @@ import java.io.InputStream; import java.io.OutputStream; import java.util.List; -import org.apache.commons.io.IOUtils; - import ch.systemsx.cisd.base.exceptions.IOExceptionUnchecked; import ch.systemsx.cisd.hdf5.HDF5FactoryProvider; import ch.systemsx.cisd.hdf5.IHDF5Reader; @@ -36,6 +34,8 @@ import ch.systemsx.cisd.hdf5.io.HDF5IOAdapterFactory; */ final class HDF5ContainerReader implements IHDF5ContainerReader { + private final byte[] buffer = new byte[HDF5ContainerWriter.BUFFER_SIZE]; + private final IHDF5Reader innerReader; HDF5ContainerReader(final File hdf5Container) @@ -63,13 +63,25 @@ final class HDF5ContainerReader implements IHDF5ContainerReader return innerReader.getGroupMembers(groupPath); } + private long copy(InputStream input, OutputStream output) throws IOException + { + long count = 0; + int n = 0; + while (-1 != (n = input.read(buffer))) + { + output.write(buffer, 0, n); + count += n; + } + return count; + } + public void readFromHDF5Container(String objectPath, OutputStream ostream) { final InputStream istream = HDF5IOAdapterFactory.asInputStream(innerReader, objectPath); Exception e = null; try { - IOUtils.copyLarge(istream, ostream); + copy(istream, ostream); } catch (IOException ex) { e = ex; -- GitLab