Ler dados diretamente do arquivo de memória RAM em C ++
-
23-08-2019 - |
Pergunta
Existe uma maneira de ler diretamente um arquivo binário na memória RAM?
O que quero dizer é, existe uma maneira de dizer ao compilador, aqui está o arquivo, aqui está o bloco de RAM, por favor, coloque o conteúdo do arquivo na RAM, temos que ir, rapidamente como você pode agradar.
Atualmente estou percorrendo o arquivo com carga ifstream-lo na memória RAM (uma matriz) bloco de 64 bits por bloco de 64 bits. Mas eu estou pensando que isso deve retardá-lo como ele é como (aqui vem uma analogia) usando um dedal para socorrer a água fora de um copo (o arquivo) em um jarro (RAM) ao invés de apenas pegar o copo e derrubando todo o conteúdo na jarra de uma vez.
Como um parente recém-chegado a este I pode ter completamente a idéia errada sobre isso -. Qualquer guidence seria uma grande ajuda
Eu sou apenas após o meio mais rápido para obter um arquivo grande para a RAM.
Graças
Solução
O que o impede de ler o arquivo em uma passagem? É demasiado grande para caber na memória?
Você também pode usar arquivo mapeado, UNIX: mmap, o Windows: CreateFileMapping
Outras dicas
Eu acho que você precisa é memória arquivo mapeado , no entanto, a API depende qual sistema operacional você está, no UNIX Eu acredito que é mmap ().
mmap
deve trabalhar para você. A maioria das implementações realmente não ler o arquivo até que você faz referência as páginas de memória real, mas em qualquer caso, você pode acessar o conteúdo do arquivo como se fosse na memória RAM todo o tempo.
Você não diz qual plataforma você está, mas isso soa como um trabalho para arquivos mapeados na memória.
Seu programa é dado a memória virtual - alguns dos que é mapeado sobre RAM, alguns em arquivo de swap e você não pode fazer muito sobre isso. No entanto, você pode reduzir a sobrecarga de usar a interface do sistema de arquivos por apenas copiando blocos maiores -. Vários megabytes por exemplo
Eu não tenho certeza se é isso que você está perguntando, mas para acelerar a leitura de um arquivo que você poderia tampão mais bytes. o segundo argumento do método de leitura () de fstream pode ser definido para especificar o tamanho de entrada. dando-lhe, por exemplo, um valor de 32 K (32 * (2 ^ 10)) podem acelerar o processo de leitura. Eu sugiro que você faça alguma benchmarking com tamanho do buffer diferente.
Se você quer dizer "evitar colocar o arquivo em swap e colocá-lo sempre na RAM" Eu acho que você pode, uma vez que este é algo que o OS cuida.
Veja o exemplo ContentStreaming no DirectX SDK.
Ele usa a abordagem de mapeamento de arquivo. Obviamente, seus usos da API do Windows, mas você pode encontrar a API correspondente para outras plataformas também.
O interessante é que ele mostra a abordagem no contexto. (Leitura in / paginação em partes de um enorme modelo (neste caso terreno) sob demanda
Aumento fornece suporte multiplataforma para arquivos de memória mapeada, entre outras coisas ...