Dúvida sobre performance em criação de imagens

4 respostas
Djonatah

Bom dia pessoal, estou com a seguinte situação.

Temos uma api para gerar gráficos (http://big.faceless.org/products/graph) que nativamente salva suas imagens em pdf, svg, png e flash, além de me fornecer a imagem como uma BufferedImage.

Como eu preciso das imagens em JPEG usei o BufferedImage associado a api JAI (https://jai.dev.java.net/).

O problema é que eu preciso criar 20 mil imagens (resolução 300dpi. tamanho - 20cm x 10cm). Esse processo está me tomando cerca de 4h+ (cerca de 75 imagens/min em “best case scenario”).

Pergunta - há alguma maneira de eu dar uma melhorada em meu processo (eu sei que não é apenas o armazenamento da imagem que está me tomando tempo, mas é onde eu teria que dar uma melhorada por enquanto).

Aqui vai uma parte de meu código.

ImageOutput image = new ImageOutput(xmlGraph.getWidth(), xmlGraph.getHeight());
	graph.draw(image);
	JPEGEncodeParam encodeParam = new JPEGEncodeParam();
	encodeParam.setQuality(0.75f);
	BufferedImage outputImage = image.getReducedColorImage(256, Color.WHITE); // buffered image from BFO API
	JAI.create("filestore", outputImage, outputFilePath, "jpeg", encodeParam);

Obrigado pelas opiniões.
E uma ótima semana a todos

Abraços
<><

4 Respostas

T

Vou fazer uma perguntinha boba.

É possível você rodar esse processo em uma máquina com vários processadores (um Core2Duo ou um Pentium Dual Core já serve) , e dividir seu trabalho em várias threads (1 por processador, já que o processo é realmente “compute-bound”?)

Você está gerando uma figura de 2,8 megapixel em menos de 1 segundo, incluindo a parte de criar o gráfico, que costuma ser razoavelmente lenta.

Então não parece que dá para melhorar “muito” isso aí.

Djonatah

Hmmm… a questão sobre rodar em duas threads seria interessante, não havia pensado na idéia. Talvez haja uma pequena possibilidade… teria que conversar com uns colegas meus aqui sobre a possibilidade.

Outra questão é que esse processo já roda em um servidor relativamente rápido…Se não me engano é um processador Xenon…

De qualquer forma eu volto para postar um feedback.

Obrigado pela resposta Thingol

T

Hum… não é bom você reduzir o número de cores, como você fez, se seu objetivo é converter para JPEG. Além de o gráfico ficar mais feio, o JPEG de qualquer maneira tenta processar tudo como se tivesse 8 bits por componente de cor (ou seja, 24 bits por pixel). Portanto, o processo de conversão para 256 cores talvez esteja deixando seu processo mais lento.

Djonatah

Na verdade eu preciso fazer isso. A imagem em si contém transparência (a “saída padrão” da API é PNG), consequentemente se eu salvá-la da maneira como ela “sai da API” ela fica muito estranha (cores erradas).

Além do processador, vou tentar umas outras situações aqui (formato da imagem de saída, e obter a BufferedImage sem processamento das cores…)

Mais uma vez obrigado.

<><

Criado 6 de abril de 2009
Ultima resposta 6 de abr. de 2009
Respostas 4
Participantes 2