Por que arquivos XML grandes travam tudo
Um arquivo de 200 MB leva dez minutos para abrir em um editor e consome três gigabytes de memória. O editor não é ruim: o que custa caro é o jeito padrão de ler XML.
Árvore ou fluxo
Há dois jeitos de ler um XML.
Montar uma árvore. O documento inteiro vira objetos: um elemento, seus atributos, seus filhos, uma ligação ao pai. É cômodo — dá para ir a qualquer lugar — e caro: cada elemento carrega uma sobrecarga várias vezes maior que o próprio texto. Regra prática: a árvore pesa de 5 a 10 vezes mais que o arquivo.
Ler como fluxo. A leitura segue em sequência e informa eventos: “elemento aberto”, “texto”, “elemento fechado”. A memória só é gasta com o que você decidiu guardar. É menos cômodo — não dá para voltar —, mas o tamanho do arquivo deixa de ser um problema.
Um navegador monta uma árvore quando você abre um arquivo .xml. O Excel faz o mesmo ao importar. Isso explica como os dois se comportam com arquivos grandes.
Como fazemos
A leitura dá duas passadas sobre o texto, sem árvore nenhuma.
A primeira passada só conta: quais elementos ocorrem, em que profundidade, quantas vezes e quantos elementos filhos diferentes eles contêm. A memória vai para um pequeno dicionário de caminhos — dezenas de kilobytes, qualquer que seja o tamanho do arquivo. O resultado é uma lista de candidatos a “linha da tabela”, com contagens.
A segunda passada extrai só o elemento que você escolheu. A memória cresce com a tabela resultante, não com o documento: de um arquivo de 200 MB do qual você precisa de 50.000 pedidos com 15 campos cada, sai uma tabela de algumas dezenas de megabytes.
Um limite honesto: tudo isso acontece no navegador, então o texto do documento ainda é lido por inteiro. Acima de 512 MB recusamos abrir o arquivo, com uma mensagem clara, em vez de travar a aba.
O que fazer com arquivos de mais de um gigabyte
- Dividir por período ou por conta do lado do sistema que produz o arquivo. Em geral isso é possível e útil por si só.
- Converter para CSV com um script de leitura em fluxo e trabalhar com ele: um CSV só é limitado pelo seu disco.
- Carregar em um banco de dados. Se volumes assim chegam com regularidade, um visualizador não é a solução de que você precisa.
Pequenas coisas que fazem os leitores tropeçar
- Um caractere
>dentro de um valor de atributo. Não dá para achar o fim de uma tag com uma busca simples — é preciso levar as aspas em conta. - CDATA. Não há marcação dentro desses blocos; tudo é texto, mesmo que pareça tags.
- Elementos de fechamento próprio.
<item/>é uma abertura e um fechamento ao mesmo tempo. Um erro ao tratá-lo desloca todo o aninhamento seguinte, e a tabela sai errada sem sinal nenhum. - Entidades.
&e referências numéricas comoçprecisam ser expandidas, senão sobra marcação nos seus dados.
Perguntas frequentes
Quanta memória um arquivo de 100 MB precisa?
Com leitura em fluxo, mais ou menos o tamanho da tabela resultante mais o próprio texto do documento. Com uma árvore, de 500 MB a um gigabyte.
Por que o Notepad++ abre e o navegador trava?
Um editor mostra texto e não interpreta a marcação. Um navegador monta uma árvore e aplica estilos a ela.
Posso olhar só os primeiros mil registros?
Pode, e é um jeito sensato de entender a estrutura: escolha o elemento da linha e aplique um filtro.
Grátis para uso pessoal. Seu arquivo não é enviado a nenhum servidor. Versão para Windows — 3.5 MB, sem instalação: detalhes. Para organizações — licença.