Domanda
Devo eseguire il rendering di un'immagine molto grande (> 50.000 & # 178; pixel) con cairo. Per fare ciò senza esaurire la memoria, rendo parti dell'immagine (& Lt; 1.000 & # 178; pixel) una dopo l'altra e le unisco in un secondo momento.
- Crea superficie 1000x1000
- Traduci nella posizione della parte corrente
- Disegna immagine (chiamando le istruzioni di disegno usando pycairo)
- Rendering / Salva immagine su file (cairo_surface_write_to_png)
- Ripeti con la parte successiva
Poiché gli algoritmi di ritaglio cairos sono più veloci dei miei, il passaggio 3 disegna l'intera immagine, anche se è visibile solo una sua parte. La maggior parte della CPU viene utilizzata nel passaggio 3 (da Python). La maggior parte della memoria viene utilizzata nel passaggio 4 (di Cairo).
C'è un modo per accelerare le cose? Qualcosa del genere?
- Crea superficie 1000x1000
- Disegna immagine
- Sposta tutto nella posizione della parte corrente
- Rendering / Salva immagine su file
- Ripeti 3 con la parte successiva
o
- Crea superficie 50000x50000
- Disegna immagine
- Rendering / Salva solo la parte corrente dell'immagine su file
- Ripeti 3 con la parte successiva
Soluzione
Prima di tutto, usare C o Vala invece di Python probabilmente accelererà le cose.
Per quanto riguarda l'utilizzo della memoria, proverei a scrivere sul mio stream, piuttosto che su un file (vedi write_to_png_stream ). Questo potrebbe permetterti di (non ho provato questo) controllo dell'utilizzo della memoria, supponendo che Cairo non chiami la tua funzione solo una volta dopo che tutto è finito.