Qualquer pergunta de um PROFI para um SUPER PROFI - 1. - página 27

 
sergeev:

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.

Você pode. Mas é melhor alocar mais de uma vez. Funcionará mais rapidamente. Tenho-o implementado na mesma biblioteca.
 
Zhunko:
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?

 
Zhunko:
Sim, nós podemos.
como ? não me mande para MSDN e google, eu estou lá há meio dia.

TheXpert:

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?

 
Aparentemente o tamanho do mapeamento está definido para um tamanho fixo em Create.
.
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.

 
jartmailru:

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...
 
Repito: existem arquivos esparsos...
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?
 
jartmailru:
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.

Hmm. E você não pode ajustar o arquivo para o tamanho máximo dos dados a serem transferidos?
a quantidade de dados não é conhecida de antemão.
Estou lendo sobre o Sparse, talvez eles sejam úteis se puderem se expandir dinamicamente.
 
sergeev:

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.
 
TheXpert:
Expandindo-o é errado, seu tamanho já deveria levar isso em conta.
parece ser a única opção.