From 23e262b0b94e5dad3264f603a290165cf057a4ac Mon Sep 17 00:00:00 2001
From: zzz <zzz@mail.i2p>
Date: Mon, 19 Sep 2011 13:46:52 +0000
Subject: [PATCH]   * i2psnark: File allocation cleanup to use less heap

---
 .../java/src/org/klomp/snark/Storage.java     | 26 +++++++------------
 1 file changed, 9 insertions(+), 17 deletions(-)

diff --git a/apps/i2psnark/java/src/org/klomp/snark/Storage.java b/apps/i2psnark/java/src/org/klomp/snark/Storage.java
index 0f1547b15f..91ea741158 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/Storage.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/Storage.java
@@ -762,27 +762,19 @@ public class Storage
     openRAF(nr, false);  // RW
     // XXX - Is this the best way to make sure we have enough space for
     // the whole file?
+    long remaining = lengths[nr];
     if (listener != null)
-        listener.storageCreateFile(this, names[nr], lengths[nr]);
-    final int ZEROBLOCKSIZE = piece_size;
-    byte[] zeros;
-    try {
-        zeros = new byte[ZEROBLOCKSIZE];
-    } catch (OutOfMemoryError oom) {
-        throw new IOException(oom.toString());
+        listener.storageCreateFile(this, names[nr], remaining);
+    final int ZEROBLOCKSIZE = (int) Math.min(remaining, 32*1024);
+    byte[] zeros = new byte[ZEROBLOCKSIZE];
+    while (remaining > 0) {
+        int size = (int) Math.min(remaining, ZEROBLOCKSIZE);
+        rafs[nr].write(zeros, 0, size);
+        remaining -= size;
     }
-    int i;
-    for (i = 0; i < lengths[nr]/ZEROBLOCKSIZE; i++)
-      {
-        rafs[nr].write(zeros);
-        if (listener != null)
-          listener.storageAllocated(this, ZEROBLOCKSIZE);
-      }
-    int size = (int)(lengths[nr] - i*ZEROBLOCKSIZE);
-    rafs[nr].write(zeros, 0, size);
     // caller will close rafs[nr]
     if (listener != null)
-      listener.storageAllocated(this, size);
+      listener.storageAllocated(this, lengths[nr]);
   }
 
 
-- 
GitLab