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.

  1. Crea superficie 1000x1000
  2. Traduci nella posizione della parte corrente
  3. Disegna immagine (chiamando le istruzioni di disegno usando pycairo)
  4. Rendering / Salva immagine su file (cairo_surface_write_to_png)
  5. 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?

  1. Crea superficie 1000x1000
  2. Disegna immagine
  3. Sposta tutto nella posizione della parte corrente
  4. Rendering / Salva immagine su file
  5. Ripeti 3 con la parte successiva

o

  1. Crea superficie 50000x50000
  2. Disegna immagine
  3. Rendering / Salva solo la parte corrente dell'immagine su file
  4. Ripeti 3 con la parte successiva
È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top