Pergunta

Ao usar arquivos de memória mapeada parece que quer é somente leitura, ou somente gravação. Com isto quero dizer que você não pode:

  • tem uma aberta para a escrita, e mais tarde decidir não salvá-lo
  • tem aberto aberto para leitura, e mais tarde decidir salvá-lo

O aplicativo usa um arquivo de memória mapeada gravável para salvar arquivos de dados, mas desde que o usuário pode querer sair sem salvar as alterações, nós temos que usar um arquivo temporário que o usuário realmente edita. Quando os opta usuário para salvar as alterações, o arquivo original será substituído pelo arquivo temporário para que ele tenha as últimas alterações. Isto é complicado porque os arquivos podem ser muito grandes (> 1GB) e leva um longo tempo para copiá-los.

Eu tentei muitas combinações dos sinalizadores usados ??para criar o mapeamento de arquivo, mas nenhuma parecem permitir a flexibilidade de salvar na demanda. Alguém pode confirmar este for o caso? Nosso aplicativo é escrito em Delphi, mas ele usa a API padrão do Windows para criar o mapeamento, no nosso caso

FMapHandle := CreateFileMapping(FFileHandle, nil, PAGE_READWRITE, 0, 2 * 65536, nil);
FBasePointer := MapViewOfFile(FileMapHandle, FILE_MAP_WRITE, FileOffsetHigh,
FileOffsetLow, NumBytes);
Foi útil?

Solução

Eu não acho que você pode. Por isso quero dizer que você pode ser capaz de, mas não faz qualquer sentido para mim: -)

O ponto inteiro de um arquivo de memória mapeada é que é uma janela para o arquivo real. Se você não muda WANY refletidas no arquivo, você provavelmente vai ter que fazer algo como lote-se as mudanças em uma estrutura de dados (por exemplo, um conjunto de endereço de base, tamanho e dados) e aplicá-las ao salvar.

Nesse caso, você não iria realmente necessidade o arquivo de memória mapeada, basta ler e manter os pedaços que pretende alterar (bloquear o arquivo primeiro, se há uma chance de acesso multi-usuário ).

Atualização:

Você já pensou sobre a possibilidade de, ao fazer uma salvar, apagar o arquivo original e apenas mudar o nome do arquivo temporário para o nome do arquivo original? Isso é provável que seja muito mais rápido do que copiar 1G de dados de temporário para o original. Dessa forma, se você não quer que ele salvou, basta apagar o arquivo temporário e manter o original.

Você ainda vai ter que copiar os dados originais para o arquivo temporário quando o carregamento, mas você não terá que copiar as costas temporário de dados (se você salvá-lo ou não.) - que iria reduzir pela metade o tempo necessário

Outras dicas

Possível, mas não trivial.

Você tem que entender conceitos básicos de memória mapeada, e a diferença entre os três modos de arquivos mapeados na memória. Ambos reservar uma parte do seu espaço de endereço virtual e criar uma entrada de mapeamento em uma tabela interna. Sem RAM física é inicialmente atribuído. Assim, quando você tenta acessar a memória, as falhas de CPU e sistema operacional tem que arrumar. Fá-lo, copiando o conteúdo do arquivo de RAM e mapeamento da RAM para o seu processo, no endereço da falha.

Agora, a diferença entre os três modos é a forma como os descritores são definidos nas páginas mapeadas. Em todos os casos você tem acesso de leitura nas páginas. (O primeiro modo). No entanto, se você perguntar para acesso de gravação e, posteriormente, escrever para ele, em sua primeira gravação a página é marcada como gravável e sujo. Ele pode, então, ser escrito de volta para o arquivo original, a critério da OS (Segunda mode). Finalmente, é possível obter semântica copy-on-write. Você ainda começar com apenas acesso de leitura para a página na memória. Quando você escrever para ele, a CPU falhas ainda e as necessidades do sistema operacional para consertá-la. Com copy-on-write, que correção é feito definindo o armazenamento de backup da página alterada para o arquivo da página, em vez do arquivo mapeado originais.

Assim, no seu caso, você deseja usar o modo copy-on-write. Se o usuário decide descartar as modificações, não há problema. Você simplesmente descartar o mapeamento de memória. Todas as páginas que foram modificadas na memória, e foram apoiados pelo arquivo da página também são descartados.

Se o usuário não decidir salvar, você tem uma tarefa um pouco mais difícil. Agora você precisa descobrir quais partes do arquivo mudaram. Essas mudanças estão na memória, e você precisa de reaplicar os ao arquivo de origem. Você pode fazer isso com Página Guards . Assim, quando o usuário decide salvar, copiar todas as páginas modificadas para um bloco de memória separado, remapear o arquivo (inalterado) para gravação, e aplicar as alterações.

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