JAXB - unmarshal OutOfMemory: Java Heap Space
Je suis en train d'essayer d'utiliser JAXB pour unmarshal un fichier XML, mais il semble que le fichier XML est trop grande (~500 mo) pour la unmarshaller à manipuler. Je reçois java.lang.OutOfMemoryError: Java heap space
@
Unmarshaller um = JAXBContext.newInstance("com.sample.xml");
Export e = (Export)um.unmarhsal(new File("SAMPLE.XML"));
Je suppose que c'est parce que c'est en essayant d'ouvrir le grand fichier XML comme un objet, mais le fichier est trop volumineux pour le java heap space.
Est-il un autre plus "efficace en terme de mémoire" la méthode de l'analyse de gros fichiers XML ~ 500mo? Ou peut-être un unmarshaller propriété qui peut m'aider à gérer le grand fichier XML?
Voici ce que mon XML ressemble à
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!-- -->
<Export xmlns="wwww.foo.com" xmlns:xsi="www.foo1.com" xsi:schemaLocation="www.foo2.com/.xsd">
<!--- --->
<Origin ID="foooo" />
<!---- ---->
<WorkSets>
<WorkSet>
<Work>
.....
<Work>
....
<Work>
.....
</WorkSet>
<WorkSet>
....
</WorkSet>
</WorkSets>
J'aimerais unmarshal à la WorkSet niveau, tout en étant capable de lire tout le travail pour chaque WorkSet.
Vous devez vous connecter pour publier un commentaire.
Quel est votre XML ressemble? Généralement, pour les documents de grande taille je recommande aux gens de profiter d'une StAX XMLStreamReader de sorte que le document peut être unmarshalled par JAXB en morceaux.
input.xml
Dans le document ci-dessous il y a de nombreux cas de la
person
élément. Nous pouvons utiliser JAXB avec un StAXXMLStreamReader
à unmarshal le correspondantPerson
les objets un à un pour éviter de manquer de mémoire.Démo
Personne
Au lieu de l'associer à l'élément racine du document XML, nous devons ajouter
@XmlRootElement
annotations sur la racine local du fragment XML que nous allons être unmarshalling de.(Person) unmarshaller.unmarshal(xsr);
. Est-ce correct?XMLStreamReader
à la fin de cet élément. Alors, nous regardons pour le fragment suivant, nous voulons unmarshal de.while(xsr.nextTag() == XMLStreamConstants.START_ELEMENT)
. Dès qu'il obtient le programme retourne la valeur null. J'ai mis à jour mon XML ci-dessus, est-ce parce que c'est de frapper d'autres éléments avant d'arriver à laWorkSet
ouPerson
dans votre cas?XMLStreamReader
pour obtenir les choses à écrire. Vous pouvez demander à laXMLStreamReader
pour le nom de l'actuel nœud pour voir où vous en êtes dans la traversée.Vous pouvez augmenter l'espace de tas à l'aide de la
-Xmx
de démarrage argument.Pour les gros fichiers, SAX traitement est plus efficace de la mémoire, car il est basé sur l'événement, et ne prend pas en charge l'ensemble de la structure en mémoire.
J'ai fait beaucoup de recherche, en particulier en ce qui concerne l'analyse de très grande entrée définit idéalement. Il est vrai que vous pourriez combiner StaX et JaxB de manière sélective d'analyser des fragments XML, mais il n'est pas toujours possible ou souhaitable. Si vous êtes intéressé à en savoir plus sur le sujet s'il vous plaît jeter un oeil à:
http://xml2java.net/documents/XMLParserTechnologyForProcessingHugeXMLfiles.pdf
Dans ce document, je décrivons une approche alternative qui est très simple et pratique à utiliser. Il analyse de manière arbitraire d'entrée de jeux, tout en vous donnant accès à vos données dans un javabean de la mode.
Utilisation SAX ou StAX. Mais si l'objectif est d'avoir un objet en mémoire la représentation du fichier, vous aurez toujours besoin de beaucoup de mémoire pour stocker le contenu d'un gros fichier. Dans ce cas, votre seul espoir est d'augmenter la taille du tas à l'aide de la
-Xmx1024m
option JVM (ce qui définit le max taille du segment de mémoire de 1024 Mo)SAX, mais vous aurez à construire votre projet d'Exportation d'objet vous-même
Vous pouvez essayer cela aussi c'est pas une bonne pratique
mais son travail 🙂 qui s'en soucie
http://amitsavm.blogspot.in/2015/02/partially-parsing-xml-using-jaxb-by.html
D'autres de l'utilisation rationnelle STAX ou SAX ou ce que Blaise Doughan dit, c'est aussi bon et vous pouvez dire d'une manière standard, Mais si vous avez le complexe de la structure XML et que vous ne voulez pas d'annoter vos classes manuellement et utiliser XJC outil.
Dans ce cas, ce pourrait être utile.