Qualsiasi domanda da un PROFI a un SUPER PROFI - 1. - pagina 27

 
sergeev:

Questa domanda riguarda il lavoro con la mappatura della memoria.

È possibile cambiare dinamicamente la dimensione della memoria allocata (CreateFileMapping) e la sua proiezione (MapViewOfFile) senza ricorrere a copiare e ricreare?

Cioè, la questione è questa:

Un oggetto CreateFileMapping viene creato in memoria per scambiare dati tra processi (writer-reader) di 100 byte. e MapViewOfFile della stessa dimensione di 100 byte.

Il primo processo di scrittura può scrivere tutti i 100 byte di dati in memoria che il secondo processo di lettura non riesce a pulire.

Quindi la sfida è: c'è un modo per estendere la dimensione della memoria allocata senza ricreare CreateFileMapping / MapViewOfFile di nuovo?
Così il primo processo non aspetterebbe il rilascio, ma continuerebbe a scrivere nella dimensione aggiunta, mentre il secondo processo continuerebbe a leggere ulteriormente.

È possibile. Ma è meglio stanziare di più in una volta sola. Funzionerà più velocemente. L'ho implementato nella stessa libreria.
 
Zhunko:
Sì, è possibile. Ma è meglio assegnare una dimensione maggiore in una volta sola.

Ehm, questo è un po' un termine improprio.

La mappatura non ha alcuna dimensione, solo la dimensione massima è specificata alla creazione, di solito (e per default) uguale alla dimensione del file con cui stiamo lavorando.

La dimensione della vista è impostata alla creazione e può essere cambiata senza la funzione UnmapViewOfFile solo in caso di sciamanesimo con flag di accesso, e forse anche impossibile.

E perché cambiare le dimensioni?

 
Zhunko:
Sì, possiamo.
Come? Non mandarmi su MSDN e google, ci sono stato mezza giornata.

TheXpert:

Ehm, questo è un po' un termine improprio.

La mappatura non ha alcuna dimensione, solo una dimensione massima è specificata alla creazione, di solito (e per impostazione predefinita) uguale alla dimensione del file con cui si sta lavorando.

Questo è il punto. Ho scritto che la dimensione = 100 byte quando l'ho creato.
in secondo luogo, non sto lavorando con un file fisico, ma solo con la memoria. un processo passa le informazioni a un altro processo.

E perché cambiare le dimensioni?

Durante il funzionamento la memoria allocata viene riempita fino a 100 byte. Ma appaiono nuovi dati e di conseguenza dobbiamo aggiungerli. Quindi dobbiamo espandere questa dimensione per aggiungerli.

Ecco perché sto chiedendo - come espandere i 100 byte che ho allocato senza copiare e ricreare in modo intermedio.

Ce l'ho con la vista, devo solo ricrearla. Ma per quanto riguarda l'oggetto CreateFileMapping stesso, può essere espanso senza chiuderlo?

 
Apparentemente la dimensione della mappatura è impostata su una dimensione fissa in Create.
.
Probabilmente puoi solo ricreare.
.
MA: se si crea un file sparso di dimensioni enormi (ad esempio 2 gigabyte),
andrà bene. Ma la fine del file deve essere compresa al di fuori della dimensione del file di sistema.
.
Ma allora ci si dovrebbe già chiedere come sincronizzare il processo di lettura del file -
cioè come sapere quale porzione di dati viene scritta e dove.
 

In generale, non c'è bisogno di un tale volume.

I processi semplicemente scrivono/leggono in modo asincrono. E abbiamo bisogno di un modo per lo scrittore di non essere infelice mentre il lettore sta aspettando che tutti i dati siano scritti.

Cioè, avete bisogno di qualcosa come ArrayResize per espandere l'array senza cambiare il suo contenuto. una volta che il lettore ha afferrato tutti i dati, l'intera memoria è disponibile per scrivere di nuovo dall'inizio.

 
jartmailru:

Ma poi bisogna chiedersi come sincronizzare il processo di lettura del file -
cioè come sapere quale porzione di dati è stata scritta e dove.

Ho risolto subito questo problema.

ma non ancora con il ridimensionamento dinamico :(

Se Vadim (Zhunko) è così generoso, spero che mi dica quali funzioni usare...
 
Ripeto: esiste una cosa come i file Sparse...
Questo significa che un file di 2 giga occupa 0 byte sul disco.

Non puoi impostare il file alla dimensione massima di
di dati da trasferire?
 
jartmailru:
Ripeto: esiste una cosa come i file Sparse...
Significa che un file di 2 giga occupa 0 byte sul disco.

Non uso file, tutto viene fatto attraverso la memoria. Ho scritto sopra già tre volte.

// se è più facile

CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, FILE_SIZE, "Local\page");

Ho problemi con questo FILE_SIZE.

E non puoi impostare il file alla dimensione massima dei dati da trasferire?
la quantità di dati non è nota in anticipo.
Sto leggendo di Sparse, forse saranno utili se possono espandersi dinamicamente.
 
sergeev:

Questo è il punto, ti ho detto che la dimensione era impostata a 100 byte.

In secondo luogo, non sto lavorando con un file fisico, solo con la memoria. un processo passa informazioni a un altro processo.

Qual è la differenza? L'essenza è la stessa; è solo che le informazioni sono scritte in memoria e non su disco. In ogni caso, stiamo lavorando con un handle aperto tramite CreateFile.

Lì (alla creazione del file in memoria) è necessario specificare la dimensione massima possibile, oltre la quale non ci saranno informazioni.

Mentre lavorate, la memoria allocata si riempie fino a 100 byte.

E qual è il problema? Ho fatto un'altra vista con un offset di 100byte, ma la dimensione della mappatura (cioè del file) dovrebbe tenerne conto in anticipo.

L'ho preso con la vista. Ma l'oggetto CreateFileMapping stesso può essere espanso senza chiuderlo?

Espanderlo è sbagliato, la sua dimensione dovrebbe già tenerne conto.
 
TheXpert:
Espanderlo è sbagliato, la sua dimensione dovrebbe già tenerne conto.
sembra essere l'unica opzione.
Motivazione: