Existe um limite de memory para um único processo .NET

Atualmente, estamos pensando em criar um sistema de cache para armazenar dados retirados de um database SQL e disponibilizá-los para alguns outros aplicativos (site, serviço da Web, etc.). Imaginamos que o cache esteja sendo executado como um serviço do Windows e consistindo basicamente em um dictionary inteligente que contém as inputs do cache. Minha pergunta é, existe um limite para o conjunto de trabalho do aplicativo (ele será executado no windows server 2003)? Ou a quantidade de memory física é o limite?

32 bits ou 64 bits? 32bit é 2gb (para um processo), 64 bit é 1TB (enterprise edition 2003 server) .

No entanto, o tamanho máximo de um object CLR é de 2 gb, mesmo em 64 bits.

Atualização: as informações acima estavam corretas em 2008. Veja a resposta de Ohad para informações mais recentes. O servidor do Windows 2016 pode ter no máximo 24 TB .

Eu tenho feito recentemente extenso perfil em torno de limites de memory no .net em um processo de 32 bits. Nós todos somos bombardeados com a idéia de que podemos alocar até 2,4 GB (2 ^ 31) em um aplicativo .NET, mas infelizmente isso não é verdade :(. O processo de aplicação tem muito espaço para usar e o sistema operacional faz um ótimo No entanto, a própria .NET parece ter sua própria sobrecarga, que é responsável por aproximadamente 600-800MB para aplicativos típicos do mundo real que aumentam o limite de memory.Isso significa que, assim que você aloca uma matriz de inteiros que leva cerca de 1,4 GB, você deve esperar ver um OutOfMemoryException ().

Obviamente, em 64 bits, esse limite ocorre muito mais tarde (vamos conversar em 5 anos :)), mas o tamanho geral de tudo na memory também cresce (estou achando que é de ~ 1,7 a ~ 2 vezes) devido ao aumento do tamanho das palavras.

O que eu sei com certeza é que a idéia de memory virtual do sistema operacional definitivamente não lhe dá um espaço de alocação virtualmente infinito dentro de um processo. Ele está lá apenas para que os 2,4 GB cheios sejam endereçáveis ​​para todos os (muitos) aplicativos executados ao mesmo tempo.

A tabela a seguir do MSDN é a resposta mais precisa para sua consulta. Observe que o sinalizador IMAGE_FILE_LARGE_ADDRESS_AWARE não pode ser definido diretamente do compilador gerenciado, embora, felizmente, ele possa ser definido como pós-compilation através do utilitário editbin . 4GT refere-se à bandeira / 3gb.

texto alternativo

No Windows de 32 bits, você pode obter um pouco mais de memory inicializando o Windows com o sinalizador / 3gb e sinalizando seu aplicativo como “endereço grande ciente”

Matthias,

Na verdade, não é uma resposta à pergunta direta, mas uma outra maneira de abordar esse problema que contornará algumas das grandes armadilhas, que podem ser uma grande dor de cabeça com soluções de armazenamento em cache. (Desculpe, não tenho nenhuma leitura recomendada sobre o assunto.)

Implementamos isso em um projeto anterior e criamos outros problemas.

Para access offline, você pode usar o sql express nos desktops para criar um espelho do seu database (ou apenas o bit que você precisa armazenar em cache)? Então tudo que você precisa fazer é mudar para qual database seu aplicativo está apontando. Você pode até usá-lo para armazenar os diffs e reproduzi-los para o servidor – embora isso tenha outros problemas. Você pode alterar as permissions na cópia local para torná-la somente leitura se for assim.

Os dictionarys que você está pensando em criar som notavelmente como índices Sql. Eu confiaria no sql para fazer o trabalho para você, se você puder arquitetar dessa maneira. Por que reinventar essa roda? Se fizer isso, você terá que pensar cuidadosamente sobre a expiração do cache e o gerenciamento de memory – especialmente se esse for um serviço do Windows.

Boa sorte,

Sam

Como acontece com qualquer outro programa do Windows, você está limitado pelo espaço de endereço. Ou seja: em 32 bits, você pode ter 2 GB de espaço de endereço. Em x64, você pode ter 8 TB.

Se você não tiver 8 TB de memory física, ela começará a página.