Vous pouvez essayer un custom serialization mechanism pour les éléments à l'intérieur du hashmap.
Quels types d'informations envoyez-vous? à quoi ressemble l'objet à l'intérieur?
Même en utilisant le mécanisme par défaut, et en marquant tous les attributs inutiles comme transitoires aidera.
vous peut en outre tenter d'envoyer les données de votre auto sérialisation avant un ZipOutputStream mais je laisserais que comme une dernière ressource, pour le contenu binaire ne compresse pas trop.
EDIT
Depuis votre utilisant uniquement des chaînes, vous pouvez créer une enveloppe dont la sérialisation personnalisée est un tableau compressé (à peu près comme réponse Peter Lawrey) mais, en utilisant une sérialisation personnalisée vous permettrait d'encapsuler le processus de sérialisation et ont fonctionner d'une façon « transparente » pour RMI (sérialisation RMI ne connaîtrait jamais vous utilisez une version compressée)
Voici une démo:
import java.io.*;
import java.util.*;
import java.util.zip.*;
public class MapDemo implements Serializable {
private Map<String,String> map = new HashMap<String,String>();
// only for demo/comparison purposes, default would use compressoin always
private boolean useCompression;
public MapDemo(Map<String,String> map , boolean compressed) {
this.map = map;
this.useCompression = compressed;
}
// This is the custom serialization using compression
private void writeObject(ObjectOutputStream out) throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
OutputStream os = useCompression ? new DeflaterOutputStream(baos) : baos;
ObjectOutputStream oos = new ObjectOutputStream( os);
oos.writeObject(this.map );
oos.close();
out.write(baos.toByteArray());
}
}
class Main {
public static void main(String [] args) throws IOException {
Map<String,String> regular = new HashMap<String,String>();
Map<String,String> compressed = new HashMap<String,String>();
Random r = new Random();
for(int i = 0 ; i < 100000 ; i++) {
String key = ""+r.nextInt(1000000);
String value = ""+r.nextInt(1000000) ;
// put the same info
compressed.put(key , value);
regular.put(key , value);
}
save(new MapDemo(compressed, true) , "map.compressed");
save(new MapDemo(regular, false) , "map.regular");
}
private static void save(Object o, String toFile) throws IOException {
// This is similar to what RMI serialization would do behind scenes
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(toFile));
oos.writeObject(o);
oos.close();
}
}
quel genre d'objets mettez-vous dans la carte et quel est le nombre moyen d'éléments que vous avez dans la carte? –
La lenteur n'est-elle pas normale pour augmenter les données? Je veux dire que si une carte avec 100 éléments prend 100ms, une carte avec environ 200 éléments ne prendra pas environ 200ms (grosso modo). Avez-vous des chiffres qui indiquent cette lenteur? Je préfère aller partager la requête et l'envoyer au serveur par lots plutôt que de jouer avec le code pour des raisons de performances, à moins qu'il n'y ait absolument aucun moyen de le faire et que votre problème ne permette pas de diviser les requêtes ... –