تحسين أداء Aspose.PSD باستخدام ذاكرة التخزين المؤقتة قابلة للتخصيص

تحسين الأداء مع ذاكرة التخزين المؤقتة القابلة للتخصيص

يستخدم Aspose.PSD التخزين المؤقت لتخزين البيانات المؤقتة. الآلية سهلة الاستخدام وقابلة للتخصيص وشفافة. تضمن عدم وجود مشاكل في الأداء أثناء معالجة الصور. يشرح هذا المقال كيفية تخصيص ذاكرة التخزين المؤقت مع واجهة برمجة التطبيقات لـ Aspose.PSD لـ 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();
}