Pergunta

Eu tenho um aplicativo que recebe blocos de dados através da rede, e escreve-los para disco. Uma vez que todos os pedaços foram recebidos, eles podem ser decodificado / recombinados para o arquivo único que realmente representam.

Eu estou querendo saber se é útil para usar arquivos de memória mapeada ou não -. Primeiro para escrever os pedaços individuais para o disco, o segundo para o único arquivo no qual todos eles são decodificados

O meu sentimento é que ele pode ser útil apenas para o segundo caso, alguém tem algumas idéias sobre isso?

Edit: É um aplicativo C #, e eu só estou planejando uma versão x64. (Então, correndo para o problema 'maior espaço livre contíguos' não deve ser relevante)

Foi útil?

Solução

arquivos de memória mapeada são benéficos para cenários em que uma parte relativamente pequena (view) de um arquivo consideravelmente maior precisa ser acessado repetidamente.

Neste cenário, o sistema operacional pode ajudar a otimizar o uso de memória e paginação comportamento global da aplicação pela paginação dentro e fora apenas as partes usadas mais recentemente do arquivo mapeado.

Além disso, arquivos de memória mapeada pode expor características interessantes, tais como copy-on-write ou servir como base de memória compartilhada.

Para o seu cenário, arquivos de memória mapeada pode ajudá-lo a montar o arquivo se os pedaços de chegar fora de ordem. No entanto, você ainda precisa saber o tamanho final do arquivo com antecedência.

Além disso, você deve estar acessando os arquivos apenas uma vez, para escrever um pedaço. Assim, uma vantagem de desempenho sobre explicitamente implementado assíncrono I / O é improvável, mas pode ser mais fácil e mais rápido para implementar o seu gravador de arquivo corretamente.

Em .NET 4, a Microsoft adicionou suporte para arquivos mapeados na memória e há alguns artigos completos com código de amostra, por exemplo, http: //blogs.msdn.com/salvapatuel/archive/2009/06/08/working-with-memory-mapped-files-in-net-4.aspx .

Outras dicas

arquivos mapeados na memória são usados ??principalmente para Inter-Process Communication ou I / melhoria de desempenho O.

No seu caso, você está tentando obter um melhor desempenho I / O?

O ódio apontar o obivious, mas Wikipedia dá um bom resumo da situação ... http://en.wikipedia.org/wiki/Memory-mapped_file

Especificamente ...

A abordagem memória mapeada tem seu custo em falhas de página menores - quando um bloco de dados é carregado no cache de página, mas ainda não mapeados no espaço de memória virtual do processo. Dependendo das circunstâncias, memória mapeada arquivo I / O pode realmente ser substancialmente mais lento do que de arquivo padrão I / O.

Parece que você está prestes a otimizar prematuramente para a velocidade. Por que não uma abordagem de arquivo regular, e, em seguida, refatorar para MM arquivos posteriormente, se necessário?

Eu diria que ambos os casos são relevantes. Basta escrever os pedaços individuais a seu lugar adequado no arquivo de memória mapeada, fora de ordem, como eles vêm. Isto naturalmente só é útil se você sabe onde cada parte deve ir, como em um downloader bittorrent. arquivo se tiver de realizar uma análise extra para saber onde o pedaço deve ir, o benefício de uma memória mapeada pode não ser tão grande.

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