Author: bpoussin Date: 2012-09-11 20:06:45 +0200 (Tue, 11 Sep 2012) New Revision: 3774 Url: http://forge.codelutin.com/repositories/revision/isis-fish/3774 Log: utilisation de la representation interne de la chaine comme cle pour minimiser le nombre de chaine dans la JVM Modified: trunk/src/main/java/fr/ifremer/isisfish/datastore/ResultMappedStorage.java Modified: trunk/src/main/java/fr/ifremer/isisfish/datastore/ResultMappedStorage.java =================================================================== --- trunk/src/main/java/fr/ifremer/isisfish/datastore/ResultMappedStorage.java 2012-09-11 17:56:00 UTC (rev 3773) +++ trunk/src/main/java/fr/ifremer/isisfish/datastore/ResultMappedStorage.java 2012-09-11 18:06:45 UTC (rev 3774) @@ -129,6 +129,11 @@ if (result == null && internalValue != null) { result = internalValue; if (internalValue instanceof String) { + // on retrouve souvent les memes semantiques dans les matrices + // pour minimiser les chaines en memoire, on prend la representation + // interne avant de l'utiliser comme cle. + internalValue = ((String)internalValue).intern(); + result = internalValue; if (StringUtils.startsWith((String)internalValue, Month.class.getName())) { String val = StringUtils.substringAfter((String)internalValue, SEP); int monthNumber = Integer.parseInt(val); @@ -172,7 +177,10 @@ } else { result = String.valueOf(decoratedValue); } - cache.put(result, decoratedValue); + // on retrouve souvent les memes semantiques dans les matrices + // pour minimiser les chaines en memoire, on prend la representation + // interne avant de l'utiliser comme cle. + cache.put(((String)result).intern(), decoratedValue); } return result; } @@ -235,6 +243,9 @@ /** * Lit le header si possible. Si ce n'est pas possible replace le * raf a l'emplacement auquel il etait avant la tentative de lecture. + * + * Utilise pour toutes les chaines lu, la representation interne + * pour minimiser le nombre de chaine reellement en memoire * * @param raf * @return @@ -251,11 +262,11 @@ } else { result = new ResultHeaderMatrix(); result.stepValue = raf.readInt(); - result.name = raf.readUTF(); + result.name = raf.readUTF().intern(); result.dimSize = raf.readInt(); result.dimNames = new String[result.dimSize]; for (int i=0; i< result.dimSize; i++) { - result.dimNames[i] = raf.readUTF(); + result.dimNames[i] = raf.readUTF().intern(); } result.dims = new int[result.dimSize]; for (int i=0; i< result.dimSize; i++) { @@ -266,7 +277,7 @@ for (int i=0; i< result.dimSize; i++) { result.sems[i] = new ArrayList(); for (int j=0; j< result.dims[i]; j++) { - String s = raf.readUTF(); + String s = raf.readUTF().intern(); result.sems[i].add(s); } }