Zlepšení výkonu Aspose.PSD pomocí upravitelné cache
Zlepšení výkonu pomocí upravitelné Cache
Aspose.PSD používá caching pro dočasné uložení dat. Mechanismus je jednoduchý na použití, upravitelný a transparentní. Zajišťuje, že při zpracování obrázku nejsou žádné problémy s výkonem. Tento článek vysvětluje, jak upravit cache s API Aspose.PSD pro Javu.
Upravení cache
Když proces potřebuje dočasné uložení dat, toto uložení se alokuje v cache. Cache může být ve paměti nebo na disku a je nastavena uživatelem. Když dočasná data již nejsou potřebná, místo je uvolněno. Statistiky alokovaného místa lze kdykoli zkontrolovat. Způsob, jakým Aspose.PSD alokuje a používá cache, lze upravit. Tato část popisuje různá nastavení a jejich výchozí hodnoty a ukázkové kódy níže ukazují, jak je lze použít.
Nastavení, kde je cache alokována
Chcete-li upravit způsob, jak je alokováno cache místo, nastavte vlastnost CacheType. Výchozí chování je takové, že cache je alokována v paměti a když v paměti není k dispozici žádné místo, je alokována na disk. Toto chování je zachyceno režimem Auto. Režim Auto je flexibilní a maximalizuje výkon. Existují také další režimy:
- Režim CacheOnDiskOnly: alokace pouze na disk.
- Režim CacheInMemoryOnly: alokace pouze do paměti.
Volba režimu CacheOnDiskOnly může způsobit špatný výkon.
Nastavení velikosti cache
Nastavte maximální místo (v bytech), které může být alokováno na disku nebo v paměti nastavením vlastností MaxDiskSpaceForCache a MaxMemoryForCache. Výchozí hodnota obou hodnot je nastavena na 0, což znamená, že neexistuje žádný horní limit.
Ovládání přerozdělování cache
Pokud v paměti není k dispozici dostatek místa (jak je uvedeno vlastností MaxMemoryForCache) při alokaci nové cache, je cache alokována na disk. Pokud na disku není dostatek místa, je vyvolána výjimka. Proces alokace cache se přesouvá z paměti na disk, ale ne obráceně. Vlastnost ExactReallocateOnly slouží k ovládání přerozdělování paměti. Přerozdělování se pravděpodobně vyskytne u předem alokovaných cache. Může se to stát, když systém zjistí, že alokované místo nebude postačující. Pokud je ExactReallocateOnly nastavena na výchozí hodnotu False, místo je přealokováno do stejného média. Když je nastavena na True, přerozdělení nemůže překročit maximálně nastavené místo. V tomto případě je stávající alokovaná cache v paměti (která vyžaduje přerozdělení) uvolněna a rozšířené místo je alokováno na disku.
Příklady programů
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(); | |
} |