Erro OutOfMemoryError na leitura de arquivo XML com SAX

6 respostas
lucianotome

Galera, sei que muita gente vai dizer, pesquisa ai no fórum, ou no google, faz uma semana que estou fazendo isso, porem não resolvi meu problema, não quero uma solução pronta, apenas uma dica dos mais experientes no assunto, meu problema e o seguinte uso o JDOM para fazer leitura de um xml, uso SAXBuilder, para efetuar o Parse, pelo que sei o SAX trata o documento xml como um fluxo continuo (sream) e o DOM o xml todo e armazenado na memoria como uma arvore, meu problema e que o xml tem mais de 10mb, e o java retorna java.lang.OutOfMemoryError, sei que aumentando o heap space esse problema vai ser resolvido, porem usando SAX nao teria que ler arquivos de qualquer tamanho, ou seja hoje eu tenho um arquivo de 10mb, aumento o heap e resolvo o problema, mas amanha o arquivo pode ter 100mb, e ai vou ficar controlando o uso de memoria da VM, segue ai meu codigo de leitura do xml:

public ReadXml(String f)
    {
        mural = null;
        element = null;
        d=null;
         
        try
        {
            this.f = new File(f);
            SAXBuilder sb = new SAXBuilder();
            d = sb.build(this.f);
            mural = d.getRootElement();
            
            
        }
        catch(JDOMException ex)
        {
            Logger.getLogger("global").log(Level.SEVERE, null, ex);
        }
        catch(IOException ex)
        {
            Logger.getLogger("global").log(Level.SEVERE, null, ex);
        }
    }

6 Respostas

B

Você está obtendo este erro com JDom ou com SAX ?

Passa mais informações. Exemplo: O que tem nesse arquivo XML ? Qual estrutura ? Quem sabe vc está procurando resolver um problema e não achar uma solução :slight_smile:

Já passei por isso antes…a solução mais inteligente foi segregar o xml.

arquivo XML de 100Mb? Se for de terceiro até entendo…mas se for sob seu controle acho que a solução não é ler ele e sim gerar uma coisa menor.

Manda maiores informações e o código q vc usa hoje com o erro que você citou.

Abraços

T

Se você usar o SAX direito, MAS SÓ O SAX, ele nunca tem na memória mais que umas poucas linhas de XML. Acho que você está usando o SAX de forma incorreta.

Como você está usando o JDOM (que usa o SAX para efetuar o parse do arquivo completo), então você está carregando o arquivo totalmente na memória. Você tem de pegar alguma documentação que ensine a ler arquivos SÓ COM O SAX.

lucianotome

Bruno obrigado pelo interesse, cara, eu imaginava que usando o JDOM com SAXBuilder ele iria efetuar o parse com o SAX, segue ai um trecho do meu xml, o arquivo e de terceiros, eu tenho que converter e inserir em meu banco, o codigo que eu uso e este ai, o erro ocorre na linha 10:

<?xml version="1.0" encoding="iso-8859-1"?> <PLU> <ITEM><ID>17</ID><SHORT_DESC>NECTARINA KG</SHORT_DESC><LONG_DESC>NECTARINA KG</LONG_DESC><COMM_DESC>NECTARINA KG</COMM_DESC><COST_DECS>2</COST_DECS><PRICE_DECS>2</PRICE_DECS><QTY_FROM_AMT>1</QTY_FROM_AMT><PLU_TIME>2008-07-22 15:18:32</PLU_TIME><TAX_KEY>1</TAX_KEY><TAX_PERCENT>0.0000</TAX_PERCENT><TAX_EXTRA_PERCENT>0.0000</TAX_EXTRA_PERCENT><TAX_DESCRIPTION>SUBSTITUI&#515;O TRIBUTARIA</TAX_DESCRIPTION><TAX_ID>F</TAX_ID><UNIT_SHORT_NAME>Kg</UNIT_SHORT_NAME><UNIT_MAX_DECS>3</UNIT_MAX_DECS><REG_PRICE><START>2008-07-19 09:13:09</START><VALUE>1.990</VALUE></REG_PRICE></ITEM> <ITEM><ID>24</ID><SHORT_DESC>PEITO FRANGO S/OSSO KG</SHORT_DESC><LONG_DESC>PEITO FRANGO S/OSSO KG</LONG_DESC><COMM_DESC>PEITO FRANGO S/OSSO KG</COMM_DESC><COST_DECS>2</COST_DECS><PRICE_DECS>2</PRICE_DECS><QTY_FROM_AMT>1</QTY_FROM_AMT><PLU_TIME>2008-07-22 15:18:32</PLU_TIME><TAX_KEY>1</TAX_KEY><TAX_PERCENT>7.0000</TAX_PERCENT><TAX_EXTRA_PERCENT>0.0000</TAX_EXTRA_PERCENT><TAX_DESCRIPTION>ICMS 7%</TAX_DESCRIPTION><TAX_ID>T0</TAX_ID><UNIT_SHORT_NAME>Kg</UNIT_SHORT_NAME><UNIT_MAX_DECS>3</UNIT_MAX_DECS><REG_PRICE><START>2008-06-18 16:02:19</START><VALUE>7.290</VALUE></REG_PRICE></ITEM> <ITEM><ID>31</ID><SHORT_DESC>RAC.CAES CHACAL KG</SHORT_DESC><LONG_DESC>RAC.CAES CHACAL KG</LONG_DESC><COMM_DESC>RAC.CAES CHACAL KG</COMM_DESC><COST_DECS>2</COST_DECS><PRICE_DECS>2</PRICE_DECS><QTY_FROM_AMT>1</QTY_FROM_AMT><PLU_TIME>2008-07-22 15:18:32</PLU_TIME><TAX_KEY>1</TAX_KEY><TAX_PERCENT>0.0000</TAX_PERCENT><TAX_EXTRA_PERCENT>0.0000</TAX_EXTRA_PERCENT><TAX_DESCRIPTION>SUBSTITUI&#515;O TRIBUTARIA</TAX_DESCRIPTION><TAX_ID>F</TAX_ID><UNIT_SHORT_NAME>Kg</UNIT_SHORT_NAME><UNIT_MAX_DECS>3</UNIT_MAX_DECS><REG_PRICE><START>2007-11-29 13:58:53</START><VALUE>1.290</VALUE></REG_PRICE></ITEM></PLU>

lucianotome

Thingol obrigado pela dica, essa era minha maior duvida, se o JDOM carregava o xml todo para ai efetuar o parse com SAX, vou partir para outra abordagem usando somente SAX.

B

Cara,

Tenta alguns links como estes:

http://www.mscs.mu.edu/~cstruble/moodle/mod/forum/discuss.php?d=404

Eles vieram da pesquisa por “sax large xml files”:

http://www.google.com.br/search?hl=pt-BR&client=firefox-a&rls=org.mozilla%3Apt-BR%3Aofficial&hs=f8x&q=sax+large+xml+files&btnG=Pesquisar&meta=

Espero ajudar…

[]'s

renzonuccitelli

Para resolver o problema de memória use o JColtrane (http://sourceforge.net/projects/jcoltrane/). Ele usa o SAX por trás, mas não consome memória como o JDOM.

Criado 1 de agosto de 2008
Ultima resposta 18 de set. de 2008
Respostas 6
Participantes 4