Покращення продуктивності Aspose.PSD за допомогою налаштованого кешу
Покращення продуктивності за допомогою налаштованого кешу
Aspose.PSD використовує кешування для тимчасового збереження даних. Механізм простий у використанні, налаштовується та прозорий. Він гарантує відсутність проблем з продуктивністю під час обробки зображень. У цій статті пояснено, як налаштувати кеш за допомогою API Aspose.PSD для .NET.
Налаштування кешу
Коли процесу потрібне тимчасове зберігання даних, це зберігання виділяється в кеші. Кеш може бути простором у пам’яті або на диску та налаштовується користувачем. Якщо тимчасові дані більше не потрібні, простір звільняється. Статистику виділеного простору можна переглянути у будь-який час. Те, як Aspose.PSD виділяє та використовує кеші, може бути налаштовано. Цей розділ описує різні налаштування та їх значення за замовчуванням, а наведені нижче фрагменти коду показують, як їх можна використовувати.
Встановлення місця виділення кешу
Щоб настроїти, як виділяється простір кешу, встановіть властивість CacheType. За замовчуванням кеш виділяється в пам’яті, а коли в пам’яті немає достатньо місця, він виділяється на диск. Ця поведінка захоплюється автоматичним режимом. Автоматичний режим гнучкий та максимізує продуктивність. Існують й інші режими:
- режим CacheOnDiskOnly: виділення лише на диск.
- режим CacheInMemoryOnly: виділення лише в пам’ять.
Вибір режиму CacheOnDiskOnly може призвести до поганої продуктивності.
Встановлення розміру кешу
Встановіть максимальний простір (у байтах), який може бути виділений на диск чи в пам’ять, встановивши властивості MaxDiskSpaceForCache та MaxMemoryForCache відповідно. За замовчуванням обидва значення встановлені на 0, що означає, що верхньої межі немає.
Керування перерозподілом кешу
Якщо в пам’яті недостатньо місця (як вказано у властивості MaxMemoryForCache) під час виділення нового кешу, кеш виділяється на диск. Якщо на диску недостатньо місця, виникає виняток. Процес виділення кешів переходить з пам’яті на диск, але не навпаки. Властивість ExactReallocateOnly використовується для керування перерозподілом пам’яті. Перерозподіл імовірніше відбувається для передвідведених кешів. Це може траплятися, коли система вирішує, що виділеного простору буде недостатньо. Якщо ExactReallocateOnly встановлено на значення за замовчуванням, False, простір перерозподіляється на ту саму середу. Якщо встановлено на True, перерозподіл не може перевищувати максимально вказаний простір. У цьому випадку існуючий кеш у пам’яті (який потребує перерозподілу) звільняється, а розширений простір виділяється на диск.
Приклади програмного коду
// For complete examples and data files, please go to https://github.com/aspose-psd/Aspose.PSD-for-.NET | |
// 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.CacheFolder = dataDir; | |
// Set cache on disk. | |
Cache.CacheType = CacheType.CacheOnDiskOnly; | |
// The default cache max value is 0, which means that there is no upper limit | |
Cache.MaxDiskSpaceForCache = 1073741824; // 1 gigabyte | |
Cache.MaxMemoryForCache = 1073741824; // 1 gigabyte | |
// We do not recommend that you change the following property because it may greatly affect performance | |
Cache.ExactReallocateOnly = 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.AllocatedDiskBytesCount; | |
long l2 = Cache.AllocatedMemoryBytesCount; | |
PsdOptions options = new PsdOptions(); | |
//GifOptions options = new GifOptions(); | |
options.Palette = new ColorPalette(new[] { Color.Red, Color.Blue, Color.Black, Color.White }); | |
options.Source = new StreamSource(new MemoryStream(), true); | |
using (RasterImage image = (RasterImage)Image.Create(options, 100, 100)) | |
{ | |
Color[] pixels = new Color[10000]; | |
for (int i = 0; i < pixels.Length; i++) | |
{ | |
pixels[i] = Color.White; | |
} | |
image.SavePixels(image.Bounds, pixels); | |
// After executing the code above 40000 bytes are allocated to disk. | |
long diskBytes = Cache.AllocatedDiskBytesCount; | |
long memoryBytes = Cache.AllocatedMemoryBytesCount; | |
} | |
// The allocation properties may be used to check whether all Aspose.Imaging objects were properly disposed. If you've forgotten to call dispose on an object the cache values will not be 0. | |
l1 = Cache.AllocatedDiskBytesCount; | |
l2 = Cache.AllocatedMemoryBytesCount; |