Pergunta
Eu tenho que processar uma grande imagem (> 50.000² pixel) com cairo. Para fazer isso sem ficar sem memória presto partes da imagem (<1.000² pixel) um após o outro e fundi-las mais tarde.
- Criar 1000x1000 Superfície
- Traduzir para posição da parte atual
- Desenhe imagem (chamando as instruções de desenho usando pycairo)
- Render / Salvar imagem para arquivo (cairo_surface_write_to_png)
- Repita com a próxima parte
Porque Cairos recorte algoritmos são mais rápidos do que a minha, passo três empates a imagem inteira, mesmo que apenas uma parte do que é visível. A maior parte da CPU é usado no Passo 3 (por python). A maior parte da memória é utilizada no Passo 4 (por cairo).
Existe uma maneira de acelerar as coisas? Algo como isso?
- Criar 1000x1000 Superfície
- Desenhe imagem
- Mover tudo para a posição da parte atual
- Render / Salvar imagem para arquivo
- Repita 3 com próxima parte
ou
- Criar 50000x50000 Superfície
- Desenhe imagem
- Render / Save apenas a parte atual da imagem para o arquivo
- Repita 3 com próxima parte
Solução
Em primeiro lugar, utilizando C ou Vala em vez de Python provavelmente acelerar as coisas.
Como para o uso de memória, gostaria de tentar escrever a minha própria corrente, ao invés de um arquivo (ver write_to_png_stream ). Este pode permitem que você (eu não tentar isso) o uso de memória de controle, assumindo que o Cairo não chamar sua função apenas uma vez após tudo está feito.