CreateDIBSection sul disco invece di memoria fisica
-
10-10-2019 - |
Domanda
Sto avendo un problema di memoria con un algoritmo che sto usando per "Appiattire" una pagina in un documento PDF.
HBITMAP hbmp = CreateDibSection(...);
ThirdPartyBmpManipulation(hbmp, "C:\\file.pdf", 0); //renders page 0 in file.pdf
void * hdib = ConvertBitmap(hbmp); //copy a Dib Section to a Dib
DeleteObject(hbmp); //frees the HBitmap while the Dib is now in memory
Il problema è che ho un molto grande bitmap e in alcuni casi non riesco a tenere il HBitmap in memoria, mentre io destinare l'DIB da copiare.
Quindi, si tratta di un lungo tiro, ma può in qualche modo assegnare la sezione DIB su disco e hanno ancora un HBITMAP per esso? (Utilizzare la stessa maniglia per la mia funzione ConvertBitmap)
Soluzione
Qual è il modo di guasto? Tu dici "memoria fisica": Windows utilizza la memoria virtuale, sarà la pagina su disco, non c'è bisogno di preoccuparsi di rimanere a corto di memoria fisica al di là del calo di prestazioni. Se siete a corto di spazio di indirizzi, utilizzando il disco potrebbe non essere in grado di aiutarvi.
Tuttavia, CreateDIBSection
può prendere un HANDLE
ad una mappatura del file (creato con CreateFileMapping
). Se la struttura interna delle funzioni di funzione e le relative hBitmap sono abbastanza intelligente, può essere possibile per evitare di esaurire lo spazio indirizzo sfruttando questa capacità. Se sono "intelligenti" useranno MapViewOfFile
per mappare relativamente piccole "finestre" del file, se necessario nello spazio degli indirizzi del processo.