Pergunta

Update: eu provavelmente confundido problemas de uso de memória com a interface do usuário compartilhando mesmo segmento como o processamento (como fora apontado por MusiGenesis abaixo). No entanto sobre o uso de memória. Eu ainda não sou capaz de encontrar a sintaxe VB.net específico, embora as pessoas têm apontado alguma grande .Net e C # informações abaixo (e se eu estivesse mais versado nessas tecnologias, pode-se adaptar para tornar o trabalho com VB.net).

Estou criando um aplicativo VB.Net.

  • A aplicação basicamente analisa os dados Os ficheiros localizados na máquina do cliente em DataSet / tabelas de dados.
  • Em seguida, usando DataView, ele quebra o DataTables em pedaços manageble, gravações para XML e envia os dados XML para um webservice.

Os conceitos gerais estão funcionando bem, porém eu estou tendo problemas onde o uso de memória no Gerenciador de tarefas continua a crescer como o programa é usado para carregar mais e mais arquivos.

Na inicialização, antes de fazer qualquer coisa, a aplicação VB tem 27.000 K. Depois que o arquivo é analisado e mesmo depois de eu dispor do identificador de arquivo, bem como a dos dados aumenta muito. I retirar tudo no código e ainda parece que a memória em Mem restos de uso capturado. Não há nenhuma rima ou razão por que motivo o uso de memória está crescendo (ou seja, às vezes pode crescer em 20 mb ao ler um arquivo de 7MB, porém outras vezes, não aumenta em tudo, ao ler um arquivo de 3MB). Às vezes, appers para liberar alguma memória quando a análise está completa e outras vezes ele só detém.

Eu olhei .Net Memória Profiler e realmente não tenho sido capaz de fazer cara ou coroa com isso.
Eu tenho lido muito sobre internet sobre gerenciamento de memória em .Net em geral sobre Descarte e "Nothing" e conjuntos de dados, etc, no entanto realmente não encontrei nada sobre VB.Net especificamente.

Minha Pergunta geral é : Existem bons tutoriais / livros / blogs / etc que mostram um mais em profundidade tutorial sobre o gerenciamento de memória em um aplicativo VB.Net (ou seja, como / quando se desfazer / perto, etc), ou alguém tem algumas dicas específicas de lá experiência.

Foi útil?

Solução

Primeiro, você precisa perceber que o Gerenciador de Tarefas está mostrando a quantidade de memória do sistema operacional atribuiu a sua aplicação. Isso não é necessariamente a quantidade de memória realmente sendo usado. Quando um aplicativo .NET primeiras partidas, o operando de memória aloca sistema para que, tal como acontece para qualquer processo. O tempo de execução .NET, em seguida, ainda se divide essa memória e gerencia como ele é usado. O tempo de execução pode ser pensado como "gananciosos", em que a memória, uma vez atribuída pelo sistema operacional que não vai devolvê-lo a menos que especificamente solicitado pelo sistema operacional. O resultado é que o uso de memória no Gerenciador de tarefas não é preciso.

Para obter uma imagem fiel do seu uso de memória, você precisa usar o Monitor de desempenho e adicionar os contadores apropriados.

Quanto IDisposable eo padrão de descarte, você provavelmente não vai encontrar muita coisa que fala sobre isso em termos idioma específicos, uma vez que é algo fornecido pelo próprio .NET Framework e é agnóstico idioma. O padrão é o mesmo, não importa o idioma que você usa, somente a sintaxe é diferente.

Há várias referências disponíveis que lhe dará informações sobre como funciona o gerenciamento de memória. Eu tenho dois posts, um que fala sobre Usando Garbage Collection em .NET e que lista os vários recursos eu usei para criar duas apresentações sobre gerenciamento de memória em .NET.

O melhor "regra de ouro" é que se uma classe implementa IDisposable, fá-lo por uma razão e você deve garantir que você está chamando Dispose() quando você é feito usando a instância. Esta é mais facilmente conseguido com a using comunicado.

Outras dicas

O gerenciamento de memória em VB.Net é realmente tratado pelo .Net Framework, portanto, em geral, é o mesmo em VB.Net como em C #. No entanto, compreender como funciona lhe permite tomar melhores decisões de programação - quando declarar variáveis, quando os objetos estão dispostos, nesse contexto, acho que sua pergunta poderia ser enquadrada como "existem boas fontes para me dizer como código de forma eficiente e para um menor consumo de memória", ou 'alguém pode me dizer por que este material estranho está acontecendo'. Ambas as questões podem ser respondidas, dando uma compreensão mais completa de como .Net gerencia a memória, o escopo, etc. Há toneladas de recursos para responder a isso,

Dito isto, este primeiro link tem um monte de outros links que seria útil para você:

http: // geekswithblogs.net/sdorman/archive/2008/09/14/.net-memory-management-ndash-resources.aspx

E este segundo é mais ao ponto:

http://www.c-sharpcorner.com/UploadFile /tkagarwal/MemoryManagementInNet11232005064832AM/MemoryManagementInNet.aspx

Se eu fosse você eu iria punho de tudo fazer uso de um profiler para ver exatamente o que o aplicativo está fazendo. Existem vários - JetBrains, RedGate, YourKit. De lá você pode ver exatamente onde a memória não está sendo liberado.

Em seguida, você pode ver exatamente onde você precisa se concentrar para corrigir o problema

Esta não é uma resposta à sua pergunta geral, mas você pode enviar uma DataTable diretamente a um serviço web, sem a etapa intermediária de primeira escrita para XML. Na verdade, você não pode enviar um DataTable, mas você pode enviar um DataSet (porque DataSet é serializado enquanto DataTable não é), para que possa enviar um DataTable diretamente pela primeira envolvê-lo em um DataSet e em seguida, enviar o DataSet. O protocolo SOAP converte o DataSet para XML qualquer maneira, então você não está realmente ganhando nada, convertendo o DataTable para XML-se.

Eu estou supondo que a partir de sua pergunta que suas tabelas de dados são demasiado grandes para enviar tudo de uma vez, ou então você está quebrando-os em pedaços menores para que seu aplicativo cliente pode indicar o progresso para o usuário. Isso também pode ser feito sem escrever o conteúdo para XML-se.

Quanto à sua pergunta geral, não é de estranhar que, por vezes, o seu consumo de memória cresce 20mb ao ler (e enviar) um arquivo de 7MB. O XML usado para descrever uma DataTable e seu conteúdo (se você está fazendo isso sozinho ou ele está sendo serializada automagicamente quando você enviá-lo para um serviço de web diretamente) é muito detalhado.

A sua abordagem mais eficiente para este problema seria a de enviar arquivos de dados do cliente diretamente para o serviço web (ou como uma matriz byte [] ou como uma série de byte [] matrizes), e depois processar esses arquivos inteiramente em o servidor. Esta abordagem irá minimizar o tempo necessário para enviar cada arquivo para o servidor (porque o envio 7mb leva menos tempo do que o envio de 20mb ou mesmo mais).

O melhor livro para obter sobre o assunto que eu li o livro de Jeff Richter, CLR via C #:

http://www.amazon.com/CLR-via-Second-Pro -Developer / dp / 0735621632 / ref = sr_1_1? ie = UTF8 & qid = 1252853101 & sr = 8-1-soletrar

Se você quiser uma versão VB.NET, eles têm que para a primeira edição do livro, mas eu não acho que houve interesse suficiente para traduzir o livro em VB.NET para a segunda versão. Se você quiser realmente aprender NET, você deve se sentir confortável com C #. Em ambas as línguas, a memória é gerenciada pelo CLR.

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