2010-09-16 6 views
0

Quel est le moyen le plus efficace (performant) pour effectuer la transformation de 500 fichiers XML, jusqu'à 50 Mb chacun et en faisant une seule chaîne hors d'eux. Tous les fichiers sont en format XML et doivent conserver la mise en forme etc.Transformation de nombreux fichiers XML (objets fichier) en une seule chaîne contenant tous les fichiers

Je suis en train de faire la lecture en utilisant XMLEventReader, puis XMLEventWriter, en lisant un événement à la fois et en utilisant StringBuilder pour concaténer tous les résultats de la chaîne. Puis en faire une chaîne à la fin de la méthode, mais cela se bloque en raison du manque d'espace de tas Java dans l'IDE, bien avant 500 fichiers ...

Merci!

+0

Qu'est-ce que utilisez-vous la chaîne pour après? Peut-être qu'il y a un moyen plus performant s'il est possible d'ignorer cette chaîne intermédiaire. –

+0

Il n'y a pas d'option pour changer le format de sortie, car il est utilisé par quelque chose de similaire à une "bibliothèque cliente" qui ne doit pas être changée. Merci bien! – akapulko2020

Répondre

1

Cet objet String aura une taille de 50 Go maximum (50 Mo * 500 * 2). Vous êtes au courant de cela, n'est-ce pas? Comme vous parlez de l'entrée fichiers et que vous souhaitez conserver les données xml sérialisées dans une chaîne, vous n'avez pas besoin d'analyser les fichiers, mais vous pouvez simplement ajouter le contenu du fichier à votre StringBuilder.

Si l'on suppose, tous les fichiers sont dans un seul dossier et avec un peu d'aide des communes-io, cela devrait le faire (... pas sur ma machine avec 4 Go Ram, BTW):

File[] files = parentFolder.list(); 
StringBuilder veryVeryBigBuilder = new StringBuilder(); 
for (File file: files) { 
    if (isXmlFile(file)) { 
     veryVeryBigBuilder.append(FileUtils.readFileToString(), encoding); 
    } 
} 
+0

Les maths semblent effrayants :), merci. pourquoi * 2 BTW? – akapulko2020

+0

vous voulez dire que je devrais juste lire le fichier (comme octets []?) Et ajouter à StringBuilder? – akapulko2020

+0

Un 'char' en Java est représenté par 16 bits et un String est soutenu par un' char [] '. –

0

Avez-vous vraiment besoin de vous soucier de leur XML? Vous ne pouvez pas lire chaque fichier tour à tour ligne par ligne en utilisant un BufferedReader et juste sortir toutes les lignes à PrintWriter?

+0

J'ai besoin de préserver leur XMLness, par manque de meilleur mot -comme c'est ce que la méthode de l'appelant attend ... Je vais vérifier l'approche que vous avez suggéré et voir si cela fonctionne pour ce cas. – akapulko2020

+1

Notez que le fichier concaténé résultant ne sera pas valide car il n'aura pas un seul noeud racine. Cependant, il semble improbable que vous utilisiez jamais un fichier aussi volumineux que XML; l'analyser serait presque certainement vous sortir de la mémoire. – Qwerky

+0

Oui, c'est en effet la réponse d'erreur fournie par la méthode de l'appelant. Comme il l'analyse en effet comme XML .. :( – akapulko2020

Questions connexes