Pergunta

Será que a leitura de dados XML como no código a seguir criar a árvore DOM na memória?

my $xml = new XML::Simple;

my $data = $xml->XMLin($blast_output,ForceArray => 1);

Para grandes arquivos XML que eu deveria usar um SAX analisador, com manipuladores, etc.?

Foi útil?

Solução

Eu diria que sim para ambos. A biblioteca XML :: Simple irá criar a árvore inteira na memória e é um grande múltiplo do tamanho do arquivo. Para muitas aplicações se o seu XML é mais de 100MB ou mais, ele vai ser prático impossível inteiramente carregar na memória em perl. A SAX parser é uma maneira de começar "eventos" ou notificações que o arquivo é lido e marcas são abertos ou fechados.

Dependendo de seus padrões de uso, ou um SAX ou um analisador DOM com base poderia ser mais rápido: por exemplo, se você está tentando lidar com poucos nós, ou todos os nós, em um arquivo grande, o modo SAX é provavelmente melhor . Por exemplo, a leitura de um grande feed RSS e tentar analisar cada item nele.

Por outro lado, se você precisa atravessar referência uma parte do arquivo com outra parte, um analisador DOM ou acessar via XPath fará mais sentido - escrevê-lo da maneira "inside-out" que um parser SAX requer será desajeitado e complicado.

Eu recomendo a tentar um parser SAX pelo menos uma vez, porque o pensamento orientado a eventos necessário para fazê-lo é um bom exercício.

Eu tive um bom sucesso com XML :: SAX :: Máquinas para configurar análise SAX em perl - se você quiser vários filtros e dutos é fácil de configurar. Para configurações mais simples (ou seja, 99% do tempo), você só precisa de um único filtro sax (olhada XML :: Filtro :: Base) e dizer XML :: SAX :: Máquinas para apenas analisar o arquivo (ou ler a partir filehandle) usando seu filtro. Aqui está um artigo completo.

Outras dicas

Para grandes arquivos XML, você pode usar XML :: LibXML, em modo DOM se os ajustes documento na memória, ou usando o modo de puxar (veja XML :: LibXML :: leitor ) ou XML :: Twig (que eu escrevi, por isso estou tendenciosa, mas funciona geralmente bem para arquivos que são grandes demais para caber na memória).

Eu não sou um fã de SAX, que é difícil de usar e de fato bastante lento.

Eu não usei o módulo XML :: Simple antes, mas a partir do documentação ele aparece para criar um hash simples na memória. Esta não é uma árvore DOM completo, mas pode muito bem ser suficiente para suas necessidades.

Para grandes arquivos XML, usando um analisador SAX seria mais rápido e têm uma pegada de memória menor, mas então ele voltaria a depender de suas necessidades. Se você só precisa processar os dados em série, em seguida, usando XML :: SAX provavelmente atender às suas necessidades. Se você precisar de manipular toda a sua árvore, então talvez usando algo como XML :: LibXML seria melhor para você.

É todos os cavalos para cursos i tenho medo

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top