Pergunta

Ei, aqui está o problema,

Essencialmente, eu tenho uma lista muito grande que contém, por sua vez relativamente grande Dicionários

Então, basicamente, eu tenho uma muito grande na coleta de memória.

Eu então serializar esta coleção manualmente para XML, e enviá-lo através de HTTP. escusado será dizer, o XML é muito grande, às vezes tão grande que eu recebo uma exceção OutOfMemory antes mesmo de tentar enviá-lo.

Em .NET, como eu iria sobre como calcular o uso de memória em potencial. Por exemplo, neste caso, eu tenho que quebrar o XML em pedaços, processando apenas pequenas quantidades de coleção em um tempo.

Como posso eficiente calcular o tamanho de cada "pedaço" on-the-fly. eu não querer escolher um número arbitrário como, "processar 100 itens de uma só vez", quero saber, aproximadamente, quão grande cada bloco deve ser para uma base caso a caso.

aplausos

Atualizar

Embora @Jacob forneceu a melhor solução para este problema em particular, a estrutura conceitual do aplicativo é em si falho.

Na verdade, a solução é executar uma fração de sua mensagem, a fim de calcular como potencialmente grande a mensagem será, quando se trabalha com uma coleção.

Você, então, enviar a cada unidade de tamanho aceitável, um por um.

Mas este é apenas um hack. A verdadeira solução, quer seja para encontrar uma maneira de não passar mensagens grandes, ou usar um protocolo completamente diferente.

Há um interessante post sobre o assunto aqui embora se você quiser usar SOAP, no entanto eu decidi encontrar uma maneira de contornar o envio de tantos dados.

Foi útil?

Solução

Eu acho que você pode ter um problema conceitual mais do que qualquer outra coisa. "O uso potencial de memória Calcular" está em desacordo com "calcular eficientemente o tamanho de cada pedaço". A única maneira de realmente obter pelo seu uso de memória para o grau de precisão onde você pode prever tamanho adequado pedaço é realmente faça sua conversão.

Parece que a melhor maneira de vir a isso de forma eficiente poderia ser a de enfrentá-lo progressivamente - essencialmente o que aqueles que estão sugerindo objetos de streaming estão dizendo. Se você não pode aproveitar de streaming real, você provavelmente vai querer estruturar o seu serialização para que você progride uma unidade conceitual de cada vez (ou seja, um item em sua lista com o seu crianças dicionário de atendimento).

Outras dicas

Por que você não apenas transmitir os dados para que apenas converter para XML on the fly evitando ter um arquivo XML enorme em memória?

Como você enviá-lo? Você deve fazê-lo por meio do WCF, o que pode fazer streaming de. Ele também lhe daria uma escolha, através de configuração, de se XML uso ou binário, ou o que quer.

Se for um problema para enviar, não é também um problema para receber? Parece que você está tentando resolver metade de um problema. XML é um grande não-não para grandes volumes de dados.

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