2010-12-29 5 views
3
java.lang.OutOfMemoryError 
at com.solvoterra.xmlengine.Element.<init>(Element.java:9) 
at com.solvoterra.xmlengine.XML_Handler_Main.startElement(XML_Handler_Main.java:71) 
at org.apache.harmony.xml.ExpatParser.startElement(ExpatParser.java:146) 
at org.apache.harmony.xml.ExpatParser.append(Native Method) 
at org.apache.harmony.xml.ExpatParser.parseFragment(ExpatParser.java:505) 
at org.apache.harmony.xml.ExpatParser.parseDocument(ExpatParser.java:492) 
at org.apache.harmony.xml.ExpatReader.parse(ExpatReader.java:308) 
at org.apache.harmony.xml.ExpatReader.parse(ExpatReader.java:264) 
at com.solvoterra.xmlengine.Project_Man.readXML_File(Project_Man.java:148) 
at com.solvoterra.xmlengine.Project_Man.run(Project_Man.java:83) 
at java.lang.Thread.run(Thread.java:1102) 

Je peux voir de cela, l'erreur est survenue pendant l'exécution d'un nouveau processus qui ne contient que la fonction de SAX Parse un fichier XML en mémoire (RAM) Je ne connais pas tous les détails que cette information a été fourni par un utilisateur anonyme sur le marché. Avant que la fonction d'analyse soit appelée, tous les tampons et la mémoire sont effacés des données existantes.OutOfMemoryError

Q: Est-il possible que l'utilisateur tente d'analyser une base de données HUGE XML en mémoire et que la RAM allouée par son téléphone ne soit pas suffisante pour gérer sa base de données?

+0

Peut-être devriez-vous envisager d'utiliser la base de données sqlite et juste parcourir avec des requêtes à l'intérieur au lieu d'analyser XML? – ykatchou

+0

J'écris un éditeur XML que vous voyez. –

Répondre

1

La méthode d'analyse Sax ne charge pas les objets dans la mémoire elle-même (par opposition à DOM). Seule votre façon de gérer les événements générés par SAX peut provoquer une surcharge de mémoire.

Si vous permettez à vos utilisateurs de choisir librement une source XML, vous devez soit:

  • construire un algorithme d'analyse syntaxique qui stocke dans BD ou fichier le résultat de l'un des éléments de l'analyse à la fois
  • construire un algorithme d'analyse qui charge les premiers éléments X de la source XML et si possible permet d'aller chercher les éléments suivants à la demande (paginer)
  • vérifier la longueur de la source XML avant l'analyse afin d'afficher un message d'erreur à l'utilisateur demandant lui de charger une source plus petite

Une autre raison de cette OutOfMemoryError pourrait être une fuite de mémoire dans votre application qui n'est pas liée à votre analyseur XML. Par exemple, les changements d'orientation, s'ils ne sont pas manipulés avec soin, peuvent facilement causer des fuites de mémoire. Si la mémoire de votre application est saturée, l'erreur OutOfMemoryError peut être déclenchée par TOUTE allocation de mémoire, mais cette allocation de mémoire unique peut ne pas être responsable de la saturation totale de la mémoire de processus.

+0

Est-il vrai que SAX lit un fichier entier en une fois ... si c'est le cas, j'ai pensé à votre deuxième option mais si l'utilisateur utilise disons un fichier XML 4mib et le fichier entier doit être lu chaque fois que le l'utilisateur veut naviguer vers un nouveau noeud qui va mener à une navigation assez lent. Le choix le plus facile serait bien sûr votre 3ème option, devinez que j'ai besoin d'exécuter des tests avec différentes tailles de fichiers, etc –

+0

Y at-il un moyen de demander plus de mémoire à allouer à l'application? –

+0

Non, et la limite peut être différente sur différents appareils. –

0

La mémoire est facilement possible (je veux dire si le fichier XML est placé dans la RAM). SAX Parser est une approche d'analyse basée sur les flux (contrairement à DOM Parser). Donc, SAX lui-même ne peut pas consommer beaucoup de mémoire. La meilleure approche serait d'enregistrer le fichier XML dans un fichier/stockage externe et les données du flux à partir du fichier directement dans SAX Parser. Ce genre d'approche est exactement la manière dont l'analyseur syntaxique SAX devrait être utilisé.

+0

Le fichier XML est en effet passé dans un tableau, donc il a aussi faim qu'un analyseur DOM. Je pense que je vais exécuter des tests de taille de fichier pour déterminer le nombre d'octets provoquant l'OoME. –