Zlepšení výkonu s pomocí nastavitelné cache

Zlepšení výkonu pomocí nastavitelné cache

Aspose.PSD využívá mezipaměť pro dočasné ukládání dat. Mechanismus je snadno použitelný, nastavitelný a transparentní. Zajišťuje, že při zpracování obrazu nevznikají žádné výkonnostní problémy. Tento článek vysvětluje, jak upravit mezipaměť s využitím API Aspose.PSD pro .NET.

Nastavení cache

Pokud proces potřebuje dočasné ukládání dat, tato úložiště jsou vytvořena v cache. Mezipaměť může být umístěna buď v paměti, nebo na disku a je nastavena uživatelem. Jakmile dočasná data již nejsou potřebná, místo je uvolněno. Statistiky přiděleného místa lze kdykoliv zkontrolovat. Způsob, jakým Aspose.PSD přiděluje a používá mezipaměti, lze nastavit podle potřeby. Tato sekce popisuje různá nastavení a jejich výchozí hodnoty a kódové části níže ukazují, jak je lze použít.

Nastavení místa, kam je cache přidělována

Pro přizpůsobení způsobu, jakým je přidělováno místo v cache, nastavte vlastnost CacheType. Výchozí chování je takové, že je cache přidělena v paměti a pokud není v paměti dostatek místa, je přidělena na disk. Toto chování je zaznamenáno módem Auto. Auto mód je flexibilní a maximalizuje výkon. Existují také další módy:

  • Mód CacheOnDiskOnly: přidělení pouze na disk.
  • Mód CacheInMemoryOnly: přidělení pouze do paměti.

Vybrání módu CacheOnDiskOnly může vést k špatnému výkonu.

Nastavení velikosti cache

Nastavte maximální prostor (v bytech), který lze přidělit na disku nebo v paměti, nastavením vlastností MaxDiskSpaceForCache a MaxMemoryForCache. Výchozí hodnota obou hodnot je 0, což znamená, že zde neexistuje horní limit.

Kontrola přerozdělování cache

Pokud není k dispozici dostatek místa v paměti (jak je specifikováno vlastností MaxMemoryForCache) při přidělení nové mezipaměti, je cache přidělena na disk. Pokud na disku není dostatek místa, je vyvolána výjimka. Proces přidělování cache se přesouvá z paměti na disk, ale ne naopak. Vlastnost ExactReallocateOnly se používá k řízení přerozdělování paměti. Přerozdělování je nepravděpodobné u předem přidělených mezipamětí. Může se stát, když systém zjistí, že přidělené místo nebude postačující. Pokud je ExactReallocateOnly nastaveno na výchozí hodnotu, False, místo je přerozděleno do stejného média. Když je nastaveno na Pravda, přerozdělení nesmí překročit maximálně stanovené místo. V tomto případě je již přidělená mezipaměť v paměti (která vyžaduje přerozdělení) uvolněna a rozšířený prostor je přidělen na disk.

Ukázky programu

// 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;