Melhora de Desempenho do Aspose.PSD usando Cache Personalizável

Melhora o Desempenho com Cache Personalizável

O Aspose.PSD usa o cache para armazenamento temporário de dados. O mecanismo é simples de usar, personalizável e transparente. Ele garante que não haja problemas de desempenho durante o processamento de imagens. Este artigo explica como personalizar o cache com a API do Aspose.PSD para Java.

Personalizando o Cache

Quando um processo precisa de armazenamento temporário de dados, esse armazenamento é alocado no cache. O cache pode ser espaço na memória ou no disco e é definido pelo usuário. Quando os dados temporários não são mais necessários, o espaço é liberado. As estatísticas do espaço alocado podem ser inspecionadas a qualquer momento. Como o Aspose.PSD aloca e utiliza caches pode ser personalizado. Esta seção descreve as várias configurações e seus padrões e os trechos de código abaixo mostram como eles podem ser usados.

Definindo onde o Cache é Alocado

Para personalizar como o espaço do cache é alocado, defina a propriedade CacheType. Por padrão, o cache é alocado na memória e quando não há mais espaço disponível na memória, ele é alocado no disco. Esse comportamento é capturado pelo modo Auto. O modo Auto é flexível e maximiza o desempenho. Existem também outros modos:

  • Modo CacheOnDiskOnly: alocação apenas no disco.
  • Modo CacheInMemoryOnly: alocação apenas na memória.

Selecionar o modo CacheOnDiskOnly pode resultar em baixo desempenho.

Definindo o Tamanho do Cache

Defina o espaço máximo (em bytes) que pode ser alocado no disco ou na memória, definindo as propriedades MaxDiskSpaceForCache e MaxMemoryForCache, respectivamente. Por padrão, ambos os valores são definidos como 0, significando que não há limite superior.

Controlando Realocação do Cache

Se não houver espaço disponível na memória (conforme especificado pela propriedade MaxMemoryForCache) quando um novo cache for alocado, o cache é alocado no disco. Se não houver espaço no disco, uma exceção é lançada. O processo de alocação de cache passa da memória para o disco, mas não o contrário. A propriedade ExactReallocateOnly é usada para controlar a realocação de memória. A realocação é mais provável de ocorrer para caches pré-alocados. Pode acontecer quando o sistema percebe que o espaço alocado não será suficiente. Se ExactReallocateOnly estiver definido como o valor padrão, Falso, o espaço é realocado para o mesmo meio. Quando definido como Verdadeiro, a realocação não pode exceder o espaço máximo especificado. Nesse caso, o cache alocado na memória (que requer realocação) é liberado e um espaço estendido é alocado no disco.

Exemplos de Programa

String dataDir = Utils.getDataDir(ControllCacheReallocation.class) + "PSD/";
// By default the cache folder is set to the local temp directory. You can specify a different cache folder from the default this way:
Cache.setCacheFolder(dataDir);
// Set cache on disk.
Cache.setCacheType(CacheType.CacheOnDiskOnly);
// The default cache max value is 0, which means that there is no upper limit
Cache.setMaxDiskSpaceForCache(1073741824); // 1 gigabyte
Cache.setMaxMemoryForCache(1073741824); // 1 gigabyte
// We do not recommend that you change the following property because it may greatly affect performance
Cache.setExactReallocateOnly(false);
// At any time you can check how many bytes are currently allocated for the cache in memory or on disk By examining the following properties
long l1 = Cache.getAllocatedDiskBytesCount();
long l2 = Cache.getAllocatedMemoryBytesCount();
PsdOptions options = new PsdOptions();
Color[] color = {Color.getRed(), Color.getBlue(), Color.getBlack(), Color.getWhite()};
options.setPalette(new ColorPalette(color));
options.setSource(new StreamSource(new java.io.ByteArrayInputStream(new byte[0])));
try (RasterImage image = (RasterImage) Image.create(options, 100, 100)) {
Color[] pixels = new Color[10000];
for (int i = 0; i < pixels.length; i++) {
pixels[i] = Color.getWhite();
}
image.savePixels(image.getBounds(), pixels);
// After executing the code above 40000 bytes are allocated to disk.
long diskBytes = Cache.getAllocatedDiskBytesCount();
long memoryBytes = Cache.getAllocatedMemoryBytesCount();
// The allocation properties may be used to check whether all Aspose.PSD objects were properly disposed. If you've forgotten to call dispose on an object the cache values will not be 0.
l1 = Cache.getAllocatedDiskBytesCount();
l2 = Cache.getAllocatedMemoryBytesCount();
}