Улучшение производительности Aspose.PSD с использованием настраиваемого кэша
Улучшение производительности с помощью настраиваемого кэша
Aspose.PSD использует кэширование для временного хранения данных. Механизм прост в использовании, настраиваем и прозрачен. Он гарантирует отсутствие проблем с производительностью во время обработки изображений. В этой статье объясняется, как настроить кэш с помощью API Aspose.PSD для Java.
Настройка кэша
Когда процессу требуется временное хранение данных, это хранение выделяется в кэше. Кэш может находиться в памяти или на диске и устанавливается пользователем. Когда временные данные больше не нужны, выделенное место освобождается. Статистику выделенного пространства можно проверить в любое время. Как Aspose.PSD выделяет и использует кэши, можно настраивать. В этом разделе описаны различные настройки и их значения по умолчанию, а приведенные ниже фрагменты кода показывают, как они могут использоваться.
Установка места, где выделяется кэш
Чтобы настроить способ распределения пространства кэша, установите свойство CacheType. По умолчанию кэш выделяется в памяти, и когда в памяти больше нет места, он выделяется на диск. Это поведение захвачено режимом Auto. Режим Auto гибок и максимизирует производительность. Есть также другие режимы:
- Режим 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(); | |
} |