Qual é a maneira mais eficiente de extrair informações de um grande número de arquivos xml em python?

StackOverflow https://stackoverflow.com/questions/344559

Pergunta

Eu tenho um diretório completo (~ 10 3 , 10 4 ) de arquivos XML a partir do qual eu preciso para extrair o conteúdo de vários campos. Eu testei diferentes analisadores XML, e desde que eu não precisa validar o conteúdo (caro) eu estava pensando em simplesmente usando xml.parsers.expat (o mais rápido) para percorrer os arquivos, um por um para extrair o dados.

  1. Existe uma maneira mais eficiente? (Correspondência de texto simples não trabalho)
  2. que eu preciso emitir uma nova ParserCreate () para cada novo arquivo (ou string) ou posso reutilizar o mesmo para cada arquivo?
  3. Qualquer ressalvas?

Obrigado!

Foi útil?

Solução

A maneira mais rápida seria para coincidir com cordas (com, por exemplo, as expressões regulares) em vez de analisar XML -. Dependendo de suas XMLs isso poderia realmente trabalho

Mas a coisa mais importante é esta: em vez de pensar através de várias opções, basta implementá-las e tempo-los em um pequeno conjunto. Isso levará aproximadamente a mesma quantidade de tempo, e lhe dará números reais não levá-lo para a frente.

EDIT:

  • Os arquivos em uma unidade de rede ou unidade local? Rede de I / O vai te matar aqui.
  • O problema parallelizes trivialmente -. Você pode dividir o trabalho entre vários computadores (ou vários processos em um computador multicore)

Outras dicas

Normalmente, eu sugiro usar do ElementTree iterparse , ou extra-velocidade, o seu homólogo de lxml . Além disso, tente usar Processamento (vem built-in com 2,6) para paralelizar.

A coisa importante sobre iterparse é que você começa as estruturas elemento (sub-), como eles são analisados.

import xml.etree.cElementTree as ET
xml_it = ET.iterparse("some.xml")
event, elem = xml_it.next()

event será sempre o "end" seqüência neste caso, mas você também pode inicializar o analisador também para informá-lo sobre novos elementos como eles são analisados. Você não tem qualquer garantia de que todos os elementos filhos terão sido analisados ??nesse ponto, mas os atributos estão lá, se você está interessado apenas em isso.

Outro ponto é que você pode parar de ler elementos de iterador cedo, ou seja, antes de todo o documento foi processado.

Se os arquivos são grandes (são eles?), Há uma expressão comum para manter a memória para uso constante assim como em um analisador de streaming.

Se você sabe que os arquivos XML são gerados usando o sempre mesmo algoritmo, pode ser mais eficiente para não fazer qualquer análise XML em tudo. Por exemplo. se você sabe que os dados estão nas linhas 3, 4 e 5, que você pode ler o arquivo linha por linha, e então usar expressões regulares.

É claro, essa abordagem seria um fracasso se os arquivos não são gerados por máquina, ou provenientes de diferentes geradores, ou se o gerador muda ao longo do tempo. No entanto, estou otimista de que se ser mais eficiente.

Se vai ou não reciclar os objetos analisador é em grande parte irrelevante. Muitos outros objetos irá ser criada, portanto, um único objeto parser não conta muito.

Uma coisa que você não indica se é ou não você está lendo o XML em um DOM de algum tipo. Eu estou supondo que você provavelmente não é, mas na chance que você é, não. Use xml.sax vez. Usando SAX em vez de DOM vai te dar um ganho significativo de performance.

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