Manipulação de XML Gigante

.NET

02/01/2013

Pessoal,

Preciso acessar a página de uma empresa parceira, baixar um xml (de cerca de 02 GB) e manipulá-lo na minha aplicação.
Hoje, copio o arquivo da empresa parceira para o meu servidor e tento desiarilizar o xml em um dataset.

Em arquivos menores faço isso sem problemas, mas pelo tamanho do arquivo, além de muito demorado, as vezes ainda ocorre Timeout na operação.

Alguém teria uma dica de como fazer nesse caso?

Obrigada!
Flavia Santos

Flavia Santos

Curtidas 0

Respostas

Robson Alves

Robson Alves

02/01/2013

Oi Flávia!

Você está usando XMLReader?

Ele é o mais performático e não guarda Cache, portanto o erro inicial de Timeout é resolvido!
Depois transforma o reader na fonte de dados necessária.

GOSTEI 0
Flavia Santos

Flavia Santos

02/01/2013

Oi Robson, obrigada pelo retorno!

Não estou usando o XML Reader, vou fazer alguns testes.

Obrigada!
GOSTEI 0
Flavia Santos

Flavia Santos

02/01/2013

Eu não tive uma melhora de desempenho significativa usando um XMLReader e convertendo-o para Dataset.
GOSTEI 0
Robson Alves

Robson Alves

02/01/2013

houve erros?
Pela quantidade de registro, só se você fizer leituras parciais do arquivo.
Não tenho muito expiriência com Leitura de XML no C#, será possível realizar uma espécie de TOP ?

Sendo sim, você faz uma lógica para lé-lo até o fim, de forma parcial.

GOSTEI 0
Flavia Santos

Flavia Santos

02/01/2013

houve erros?
Pela quantidade de registro, só se você fizer leituras parciais do arquivo.
Não tenho muito expiriência com Leitura de XML no C#, será possível realizar uma espécie de TOP ?

Sendo sim, você faz uma lógica para lé-lo até o fim, de forma parcial.



Erros não, mais continua extremamente lento...
Uma especie de TOP eu teria como fazer usando o LINQ to XML, mas o arquivo já deveria estar carregado na memória.
Não sei se há outras formas, essa é a que conheço.

GOSTEI 0
Robson Alves

Robson Alves

02/01/2013

Quanto tempo de processamento?
GOSTEI 0
Robson Alves

Robson Alves

02/01/2013

Veja esses dois exemplos:

http://www.csharp-examples.net/xpath-top-xml-nodes/
http://www.csharp-examples.net/xml-nodes-by-name/

Seu XML é muito complexo?
Se ele tiver uma estrutura simples de nós, você pode fazer como no exemplo!

Lendo ele de forma parcial, você terá um ganho, mas ainda se trata de 2GB de informações...

A apresentação dessas informações estarão na tela?

Se você quer ganhar "Performance" o certo é partir para uma ideia mais assíncrona e responsiva.

Por exemplo, as informações estão no GRID e só é apresentado 10 linhas, conforme o usuário rolar o scroll, ir no XML e trazer 10 + 10 ...


Abraços.
GOSTEI 0
Flavia Santos

Flavia Santos

02/01/2013

Veja esses dois exemplos:

http://www.csharp-examples.net/xpath-top-xml-nodes/
http://www.csharp-examples.net/xml-nodes-by-name/

Seu XML é muito complexo?
Se ele tiver uma estrutura simples de nós, você pode fazer como no exemplo!

Lendo ele de forma parcial, você terá um ganho, mas ainda se trata de 2GB de informações...

A apresentação dessas informações estarão na tela?

Se você quer ganhar "Performance" o certo é partir para uma ideia mais assíncrona e responsiva.

Por exemplo, as informações estão no GRID e só é apresentado 10 linhas, conforme o usuário rolar o scroll, ir no XML e trazer 10 + 10 ...


Abraços.


Então Robson, a estrutura do xml é complexa sim, o arquivo me traz um DataSet com um DataTable pai e 6 DataTables filhos.
Nenhuma informação é exibida em tela, o xml é usado para atualização da base dados de acordo com os produtos disponiveis no parceiro...
Não tenho acesso a base de dados dele, apenas o xml que ele me envia diariamente, sem a possibilidade de alteração do tipo de arquivo/objeto enviado.
Eu tenho uma rotina hoje que funciona, mas ela é pesada e demora mto para executar. As vezes ainda dá Timeout.
Eu queria customizar a rotina melhorando o seu desempenho...
GOSTEI 0
Robson Alves

Robson Alves

02/01/2013

Já utilizou integration services?
Sei que vai mudar radicalmente seu ambiente...

Ja importei arquivos enormes por ele... como é integração de bases, funcionava bem rápido..
Não vejo onde ganhar mais performance no seu código .Net, você tem muita informação diária...
GOSTEI 0
Robson Alves

Robson Alves

02/01/2013

Já vi usarem o BulkInsert.
http://msdn.microsoft.com/en-us/library/ms191184.aspx

Existe uma forma de usar o BulkInsert (maquiado) dentro do C#, não sei onde há ganhamos (estou dando essa idéia, por não conhecer seu ambiente).

Abraços.
GOSTEI 0
José

José

02/01/2013

Como a dúvida aparentemente foi sanada, estou dando o tópico por concluído.
GOSTEI 0
POSTAR