Qualquer pergunta de um PROFI para um SUPER PROFI - 1. - página 27
Você está perdendo oportunidades de negociação:
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Registro
Login
Você concorda com a política do site e com os termos de uso
Se você não tem uma conta, por favor registre-se
Esta questão diz respeito ao trabalho com o mapeamento da memória.
É possível mudar dinamicamente o tamanho da memória alocada (CreateFileMapping) e sua projeção (MapViewOfFile) sem recorrer à cópia e recriação?
Ou seja, a questão é esta:
Um objeto CreateFileMapping é criado em memória para trocar dados entre processos (gravador-leitor) de 100 bytes. e MapViewOfFile com o mesmo tamanho de 100 bytes.
O primeiro processo de escrita pode gravar todos os 100 bytes de dados na memória que o segundo processo de leitura não consegue eliminar.
Então o desafio é: existe alguma forma de ampliar o tamanho da memória alocada sem recriar o CreateFileMapping / MapViewOfFile novamente?
Para que o primeiro processo não esperasse pela liberação, mas continuasse a escrever no tamanho adicionado, enquanto o segundo processo também continuaria a ler mais.
Sim, você pode. Mas é melhor alocar um tamanho maior de uma só vez.
Erm, esse é um pouco um nome errado.
O mapeamento não tem tamanho algum, apenas o tamanho máximo é especificado na criação, geralmente (e por padrão) igual ao tamanho do arquivo com o qual estamos trabalhando.
O tamanho da visão é definido na criação e pode ser alterado sem a função UnmapViewOfFile somente em caso de xamanismo com bandeiras de acesso, e talvez até impossível.
E por que mudar o tamanho?
Sim, nós podemos.
Erm, esse é um pouco um nome errado.
O mapeamento não tem tamanho algum, apenas um tamanho máximo é especificado na criação, geralmente (e por padrão) igual ao tamanho do arquivo com o qual você está trabalhando.
A questão é essa. Eu escrevi que o tamanho = 100 bytes quando o criei.
em segundo lugar, não estou trabalhando com um arquivo físico, mas apenas com memória. um processo passa a informação para outro processo.
E por que mudar o tamanho?
Durante a operação, a memória alocada é preenchida até os 100 bytes completos. Mas novos dados aparecem e consequentemente temos que adicioná-los. Portanto, temos que expandir este tamanho para adicioná-los.
É por isso que eu estou perguntando - como expandir os 100 bytes que eu atribuí sem copiar e recriar intermediários.
Eu o consegui com a vista. Só preciso recriá-la. Mas e o CreateFileMapping object em si? Pode ser expandido sem fechá-lo?
.
Você provavelmente só pode recriar.
.
MAS: se você criar um arquivo esparso de grande tamanho (por exemplo, 2 gigabytes),
não haverá problema. Mas o fim do arquivo tem que ser entendido fora do tamanho do arquivo do sistema.
.
Mas então já seria preciso perguntar como sincronizar o processo de leitura a partir do arquivo
, ou seja, como saber que parte dos dados está escrita e onde.
No essencial, não há necessidade de tal volume.
Os processos simplesmente escrevem/lêem assincronamente. E precisamos de uma maneira para que o escritor não fique infeliz enquanto o leitor espera que todos os dados sejam escritos.
Isto é, você precisa de algo como o ArrayResize para expandir o array sem alterar seu conteúdo. uma vez que o leitor pegou todos os dados, toda a memória está disponível para escrever novamente desde o início.
Mas então você tem que perguntar como sincronizar o processo de leitura a partir do arquivo -
ou seja, como saber que parte dos dados foi escrita e onde.
Resolvi este problema de uma vez.
mas ainda não com redimensionamento dinâmico :(
Se Vadim (Zhunko) é tão generoso, espero que ele me diga quais funções usar...Isto significa que um arquivo de 2 GB ocupa 0 bytes em disco.
Hmm. Você não pode ajustar o arquivo para o tamanho máximo
de dados a serem transferidos?
Repito: existem arquivos esparsos...
Isso significa que um arquivo de 2 gigabytes leva 0 bytes em disco.
Eu não uso arquivos, tudo é feito através da memória. Já escrevi acima três vezes.
// se for mais fácil
CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, FILE_SIZE, "Local\page");
Estou tendo problemas com este FILE_SIZE.
Estou lendo sobre o Sparse, talvez eles sejam úteis se puderem se expandir dinamicamente.
A questão é essa. Eu lhe disse que o tamanho foi ajustado para 100 bytes.
Em segundo lugar, eu não estou trabalhando com um arquivo físico, apenas memória. um processo passa informações para outro processo.
Qual é a diferença? A essência é a mesma; apenas a informação é escrita na memória e não no disco. Mesmo assim, estamos trabalhando com uma alça aberta via CreateFile.
Lá (na criação do arquivo em memória) é necessário especificar o tamanho máximo possível, acima do qual não haverá nenhuma informação.
Enquanto você trabalha, a memória alocada preenche até os 100 bytes completos.
E qual é o problema? Fez outra visualização com offset de 100byte, mas o tamanho do mapeamento (ou seja, arquivo) deve levar isso em conta de antemão.
Consegui com a vista. Mas e o próprio objeto CreateFileMapping? Ele pode ser expandido sem fechá-lo?
Expandindo-o é errado, seu tamanho já deveria levar isso em conta.