2017-02-06 1 views
-1

Est-il possible d'ajouter des éléments dans une liste Array dans java qui est déjà sérialisé sur le disque sans le recharger en RAM. J'ai besoin de ceci pour sauvegarder des données strucutrées à partir d'un fichier XML pour charger des données dans une base de données mysql. Le fichier XML a plusieurs Go de données et le problème est que je dois stocker toutes les données du fichier XML pour traiter les données?Ajout d'éléments à ArrayList sérialisé sans chargement de ArrayList dans la RAM dans JAVA

+0

L'ArrayList est-il sérialisé à l'aide de la sérialisation Java standard? Une sérialisation alternative? Votre propre sérialisation? Avez-vous besoin de charger le fichier XML en tant qu'objets Java d'origine, ou pouvez-vous simplement le traiter en utilisant des outils XML standard? – RealSkeptic

+0

Je veux le sérialiser avec la norme Java serializazion. Je suis en train de traiter le fichier XML ligne par ligne, car il est trop gros pour le charger dans RAM. J'analyse chaque tag et le stocke dans des tableaux, je veux sérialiser ces tableaux dans des objets sur le disque si la taille dans le RAM dépasse une certaine valeur – arget888

Répondre

0

ArrayList, ou toute autre structure de données d'ailleurs, est une structure de données en mémoire. Donc, tout ce que vous souhaitez mettre dans cette structure de données doit être chargé en mémoire (RAM).

Si vous vous demandez comment charger des données supérieures à la taille de la mémoire, envisagez de charger par lots. par exemple. Chargez les n premières entrées qui correspondent à la contrainte de mémoire, puis les traiter. Une fois que vous avez terminé, jetez-les et chargez le lot suivant et ainsi de suite.

+0

OK je pensais que je devais aller de cette façon, mais j'espérais que quelqu'un sait une possibilité de faire cela d'une manière différente – arget888

0

Je pense que puisque votre fichier XML est déjà en Go, alors une meilleure approche serait de lire le fichier XML en morceaux et d'enregistrer le bloc d'enregistrements dans la base de données. Continuez jusqu'à ce que EOF soit atteint.

String encoding = "UTF-8"; 
int maxlines = 100; 
BufferedReader reader = null; 
BufferedWriter writer = null; 

try { 
    reader = new BufferedReader(new InputStreamReader(new FileInputStream("/bigfile.txt"), encoding)); 
    int count = 0; 
    for (String line; (line = reader.readLine()) != null;) { 
     if (count++ % maxlines == 0) { 
      close(writer); 
      writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("/smallfile" + (count/maxlines) + ".txt"), encoding)); 
     } 
     writer.write(line); 
     writer.newLine(); 
    } 
} finally { 
    close(writer); 
    close(reader); 
}