Pergunta

O que limita o tamanho de um arquivo de memória mapeada? Eu sei que não pode ser maior do que a maior fatia contínua do espaço de endereços não alocados, e que deve haver espaço livre em disco suficiente. Mas existem outros limites?

Foi útil?

Solução

Você está sendo muito conservadora: Um arquivo de memória mapeada pode ser maior do que o espaço de endereço. O Ver do arquivo de memória mapeada é limitado por restrições de memória do sistema operacional, mas isso é apenas a parte do arquivo que você está olhando ao mesmo tempo. (E eu acho que tecnicamente você pode mapear múltiplas visões de partes descontínuos do arquivo de uma só vez, por isso, além de restrições de comprimento gerais e de página, é apenas o Número total de bytes que você está olhando que representa um limite. Você pode olhar para bytes [0-1024] e bytes [2 40 a 2 40 + 1024] com dois pontos de vista separados.)

Em MS Windows, veja o MapViewOfFile função. Ele efetivamente leva um arquivo de 64 bits offset e um comprimento de 32 bits.

Outras dicas

Esta tem sido a minha experiência ao usar arquivos de memória mapeada em Win32:

Se o seu mapa o arquivo inteiro em um único segmento, que normalmente bate para fora em torno de 750 MB, porque ele não pode encontrar um bloco contíguo maior de memória. Se você dividi-la em segmentos menores, digamos, 100 MB cada, você pode obter em torno de 1500MB-1800MB dependendo do que mais está em execução.

Se você usar o href="http://msdn.microsoft.com/en-us/library/ms791558.aspx" rel="noreferrer"> / 3g interruptor você pode obter mais de 2GB até cerca de desempenho 2700MB mas OS é penalizado.

Eu não tenho certeza sobre o 64-bit, eu nunca tentei, mas eu presumo que o tamanho máximo de arquivo é então limitado apenas pela quantidade de memória física que você tem.

Não deve haver outros limites. Não são aqueles suficiente? ; -)

Com FUSE no linux você também pode fazer um sistema de arquivos na memória que se estende para o disco sob demanda. Eu não tenho certeza que se qualifica como memória mapeada, e a distinção fica meio embaçada.

Sim, há limites para arquivos mapeados na memória. Mais chocante é:

arquivos mapeados na memória não pode ser maior do que 2 GB em sistemas de 32 bits.

Quando um memmap faz com que um arquivo a ser criado ou estendido além de seu tamanho atual no sistema de arquivos, o conteúdo da nova parte não são especificadas. Em sistemas com a semântica do sistema de arquivos POSIX, a parte ampliada será preenchido com zero bytes.

Mesmo no meu 64-bit, sistema de RAM 32GB, eu recebo o seguinte erro se tentar ler em um arquivo de memória mapeada grande numpy em vez de tomar porções dela usando byte-offsets:

Overflow Error: memory mapped size must be positive

grandes conjuntos de dados são realmente uma dor para trabalhar.

Wikipedia entrada sobre o assunto: http://en.wikipedia.org/wiki/Memory-mapped_file

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