Aspose.PSD使用可定制缓存来提高性能

カスタマイズ可能なキャッシュを使用してパフォーマンスを向上させる

Aspose.PSDは一時データの保存にキャッシングを使用しています。このメカニズムは使用が簡単でカスタマイズ可能で透明です。画像処理中にパフォーマンスに問題がないことを保証します。この記事では、Aspose.PSD APIを使用してキャッシュをカスタマイズする方法について説明します。

キャッシュのカスタマイズ

プロセスが一時データの保存を必要とする場合、この保存はキャッシュに割り当てられます。キャッシュは、ユーザーが設定することができるメモリ内またはディスク上の領域です。一時データが不要になったら、その領域は解放されます。割り当てられたスペースの統計はいつでも調査できます。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();
}