Author: schor
Date: Mon Aug 27 15:04:34 2012
New Revision: 1377706

URL: http://svn.apache.org/viewvc?rev=1377706&view=rev
Log:
[UIMA-2460] improve string binary deserialization

Modified:
    
uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/StringHeap.java

Modified: 
uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/StringHeap.java
URL: 
http://svn.apache.org/viewvc/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/StringHeap.java?rev=1377706&r1=1377705&r2=1377706&view=diff
==============================================================================
--- 
uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/StringHeap.java
 (original)
+++ 
uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/StringHeap.java
 Mon Aug 27 15:04:34 2012
@@ -20,7 +20,9 @@
 package org.apache.uima.cas.impl;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 /**
  * Encapsulate string storage for the CAS.
@@ -49,17 +51,27 @@ final class StringHeap {
    * @param shdh Serialization helper datastructure.
    */
   final void reinit(StringHeapDeserializationHelper shdh, boolean delta) {
-       if (!delta) {
-      initMemory();
-       }
-    int stringOffset;
-    int stringLength;
+       if (!delta) {
+        initMemory();
+       }
     // Simply iterate over the ref heap and add one string after another.  The 
references come out
     // right because they are defined by the positions on the ref heap.
+    int stringOffset;
+    int stringLength;
+    String charHeapInString = new String(shdh.charHeap); // UIMA-2460
+    Map<String, String> reuseStrings = new HashMap<String, String>(
+        Math.min(8, 
+                 (shdh.refHeap.length / 
StringHeapDeserializationHelper.REF_HEAP_CELL_SIZE) 
+                 / 2));
     for (int i = StringHeapDeserializationHelper.FIRST_CELL_REF; i < 
shdh.refHeap.length; i += StringHeapDeserializationHelper.REF_HEAP_CELL_SIZE) {
       stringOffset = shdh.refHeap[i + 
StringHeapDeserializationHelper.CHAR_HEAP_POINTER_OFFSET];
       stringLength = shdh.refHeap[i + 
StringHeapDeserializationHelper.CHAR_HEAP_STRLEN_OFFSET];
-      this.stringList.add(new String(shdh.charHeap, stringOffset, 
stringLength));
+      String s = charHeapInString.substring(stringOffset, stringOffset + 
stringLength);
+      String reuse = reuseStrings.get(s);
+      if (reuse == null) {
+        reuseStrings.put(s, s);
+      }
+      this.stringList.add(reuse != null ? reuse : s);  
     }
   }
 


Reply via email to