Domanda

Sto usando expat parser per analizzare un file XML di circa 15 GB. Il problema è che genera un messaggio "Memoria esaurita" errore e il programma si interrompe.

Voglio sapere se qualche corpo ha riscontrato un problema simile con il parser espatriato o è un bug noto ed è stato corretto nelle versioni successive?

È stato utile?

Soluzione

Ho usato expat per analizzare file di grandi dimensioni prima e non ho mai avuto problemi. Presumo che tu stia utilizzando SAX e non uno dei wrapper DOM espatriati. Se stai usando DOM, allora questo è il tuo problema proprio lì - sarebbe essenzialmente provare a caricare l'intero file in memoria.

Stai allocando oggetti mentre analizzi l'XML e forse non li stai deallocando? Sarebbe la prima cosa che vorrei verificare. Un modo per verificare se il problema è realmente con expat o no - se riduci il programma a una versione semplice che ha gestori di tag vuoti (ovvero analizza semplicemente il file e non fa nulla con i risultati) esaurisce ancora la memoria?

Altri suggerimenti

Non conosco affatto expat, ma immagino che per qualche motivo debba tenere troppo lo stato in memoria. L'XML è mal formato in qualche modo? Hai gestori registrati per tag di fine di blocchi di grandi dimensioni?

Sto pensando che se un gestore è registrato per la fine di un blocco di grandi dimensioni e si prevede che expat passi il blocco al gestore, allora expat potrebbe esaurire la memoria prima che sia in grado di raccogliere completamente quel blocco . Come ho detto, non conosco expat, quindi questo potrebbe non essere possibile, sto solo chiedendo.

In alternativa, sei sicuro che expat sia la perdita di memoria? Potrei immaginare una situazione in cui stavi mantenendo alcune informazioni sul contenuto del file XML e sulle tue strutture di dati, sia perché i dati erano così grandi, sia a causa di perdite di memoria nel tuo codice, causando la condizione di memoria insufficiente.

Expat è un parser guidato da eventi che non costruisce grandi strutture in memoria. Quindi probabilmente non è expat (che è molto usato per analizzare file di grandi dimensioni) questo è il problema - molto più probabilmente è il tuo codice.

Expat presenta delle perdite: ho iniziato a usarlo in un server di lunga durata e sto scoprendo che perde costantemente memoria, indipendentemente dal fatto che il parser sia libero o meno. Le versioni più recenti di xmlparse.c non risolvono questo problema, nascondono solo le perdite esistenti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top