Повишаване на производителността на Aspose.PSD чрез персонализиране на кеша
Подобряване на производителността с персонализиран кеш
Aspose.PSD използва кеширане за временно съхранение на данни. Механизмът е лесен за използване, персонализируем и прозрачен. Той гарантира, че няма проблеми с производителността по време на обработка на изображения. Тази статия обяснява как да персонализирате кеша с Aspose.PSD API за Java.
Персонализиране на кеша
Когато процесът изисква временно съхранение на данни, това съхранение се разпределя в кеша. Кешът може да бъде пространство в паметта или на диска и се задава от потребителя. Когато временните данни вече не са необходими, пространството се освобождава. Статистиката на разпределеното пространство може да се проверява по всяко време. Как Aspose.PSD разпределя и използва кешовете може да бъде персонализиран. Тази секция описва различните настройки и техните стойности по подразбиране, а кодовите откъски по-долу показват как могат да бъдат използвани.
Задаване на мястото, където се разпределя кешът
За да персонализирате начина, по който се разпределя кешовото пространство, задайте свойството CacheType. По подразбиране кешът се разпределя в паметта и когато вече няма свободно пространство в паметта, то се разпределя на диска. Това поведение се улавя от режима автоматично. Автоматичният режим е гъвкав и оптимизира производителността. Има също и други режими:
- режим CacheOnDiskOnly: разпределение само на диска.
- режим CacheInMemoryOnly: разпределение само в паметта.
Изборът на режим CacheOnDiskOnly може да доведе до лоша производителност.
Задаване на големината на кеша
Задайте максималното пространство (в байтове), което може да бъде разпределено на диска или в паметта, като зададете свойствата MaxDiskSpaceForCache и MaxMemoryForCache съответно. По подразбиране и двете стойности са зададени на 0, което означава, че няма горна граница.
Контролиране на преразпределението на кеша
Ако няма достатъчно свободно пространство в паметта (както е посочено от свойството MaxMemoryForCache), когато се разпределя нов кеш, кешът се разпределя на диска. Ако няма достатъчно място на диска, се хвърля изключение. Процесът на разпределение на кеша се премества от паметта на диска, но не и обратно. Свойството ExactReallocateOnly се използва за контролиране на преразпределението на паметта. Преразпределението вероятно се случва за предварително заделени кешове. То може да се случи, когато системата разбере, че заделеното пространство няма да бъде достатъчно. Ако ExactReallocateOnly е зададено на стойността по подразбиране, False, пространството се преразпределя в същата среда. Когато е зададено на True, преразпределението не може да надвишава максималното зададено пространство. В този случай съществуващият заделен кеш в паметта (който изисква преразпределение) се освобождава и се заделя допълнително пространство на диска.
Програмни примери
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(); | |
} |