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