Eu escrevi um aplicativo .NET 4.5 que armazena em buffer dados de cores, infravermelho e profundidade de um Kinect v2, realiza algum processamento nele e o despeja em disco, de forma descompactada; o aplicativo .NET também inicia o ffmpeg como um subprocesso e canaliza dados de cores para que sejam codificados como H.264.
Como não estou usando um SSD, os dados do vídeo chegam mais rapidamente do que posso gravar no disco. Mas tudo bem, é aceitável descartar quadros de vídeo quando estou com pouca memória RAM. Meu único requisito é que tudo o que eu mantenho seja na maior parte contíguo em pedaços de vídeo de 8 a 10 segundos. Portanto, adicionei alguma lógica no meu aplicativo .NET 4.5 para começar a descartar os quadros de vídeo quando não tenho RAM suficiente para armazenar em buffer 8 a 10 segundos contíguos de vídeo (aproximadamente 1,5 a 2 GB).
E, para evitar o surto de página, desativei completamente os arquivos de paginação. Isso me deixa com um total de 16 GB de RAM física.
Meu problema é que, mesmo com esse mecanismo, às vezes meu aplicativo .NET ou o subprocesso ffmpeg ainda é morto quando o Windows 8.1 fica surtado com pouca memória RAM, porque obviamente meu aplicativo está usando mais memória RAM quando possui um grande estoque de dados de vídeo para gravar no disco. Existe uma maneira de dizer ao Windows que meus processos são mais importantes que outros, para que o Windows comece a matar outros processos menos importantes primeiro?
CreateMemoryResourceNotification
que é muito menos invasivo.Respostas:
O Windows não mata processos quando toda a RAM é usada. O que realmente acontece é que os processos não conseguem alocar memória e travar.
Isso está acontecendo porque toda a sua memória física está em uso e porque o arquivo de paginação está desativado, o gerenciador de memória não tem mais a capacidade de gravar páginas que não estão sendo usadas. Isso mantém sua RAM física cheia e, quando seu processo, ou qualquer outra coisa em execução no momento, tenta alocar uma página, ela falha. Alguns aplicativos falham.
Esta apresentação da Technet explica: http://channel9.msdn.com/Events/TechEd/NorthAmerica/2011/WCL405
O arquivo de paginação evita que os aplicativos travem quando você utiliza toda a sua memória, agindo como um pano de fundo para o comprometimento excessivo.
A memória virtual é basicamente a base de como os sistemas operacionais modernos alocam recursos, portanto, tudo se resume a ter coisas em RAM que estão em uso e mover coisas para dentro e para fora do disco.
Na verdade, existem apenas duas respostas:
A conclusão é que a RAM é apenas outro nível de cache, e tudo sobre memória virtual, arquivos de paginação, arquivos mapeados na memória e tudo basicamente se resume a isso: se você estiver ficando sem memória, precisará adicionar Mais.
fonte
Acesse o Painel de Ferramentas do Windows e as Configurações Avançadas e desative itens desnecessários, como efeitos de janela, se ainda não o tiver, e obtenha o Sysinternals Process Explorer e / ou System Monitor para encontrar e desativar qualquer coisa estranha que esteja desperdiçando CPU ou memória.
Mais importante, use o Process Explorer e / ou o System Monitor para observar como o programa está sendo executado e ver exatamente onde e como ele falha. Qual thread fica com pouca memória e morre primeiro - o prgm principal ou a parte ffmpeg? Existe uma dll específica ou outro recurso compartilhado que aumenta inesperadamente de tamanho? Ou a execução está ocorrendo corretamente, exceto mordendo mais do que pode mastigar dados?
Descobrir com mais precisão a natureza do seu problema provavelmente o indicará na direção de uma solução. Você poderia, por exemplo, implementar sua política de queda de quadros de forma mais agressiva, otimizando melhor o critério de 8 a 10 segundos para obter uma sobrecarga geral de RAM mais baixa
Sugestões finais: talvez considere mudar para o Linux e, enquanto isso, reative o arquivo de paginação (o linux chama de espaço de troca, o que torna o IMHO mais divertido, como um encontro de troca ou algo assim!) Boa sorte.
fonte