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.

  1. Criar 1000x1000 Superfície
  2. Traduzir para posição da parte atual
  3. Desenhe imagem (chamando as instruções de desenho usando pycairo)
  4. Render / Salvar imagem para arquivo (cairo_surface_write_to_png)
  5. 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?

  1. Criar 1000x1000 Superfície
  2. Desenhe imagem
  3. Mover tudo para a posição da parte atual
  4. Render / Salvar imagem para arquivo
  5. Repita 3 com próxima parte

ou

  1. Criar 50000x50000 Superfície
  2. Desenhe imagem
  3. Render / Save apenas a parte atual da imagem para o arquivo
  4. Repita 3 com próxima parte
Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top