الوصول إلى القواميس مقابل الوصول إلى الرفوف

StackOverflow https://stackoverflow.com/questions/3409856

  •  25-09-2019
  •  | 
  •  

سؤال

حاليًا ، لديّ قاموس يحتوي على رقم كمفتاح وفئة كقيمة. يمكنني الوصول إلى سمات تلك الفئة مثل ذلك:

dictionary[str(instantiated_class_id_number)].attribute1

بسبب مشكلات الذاكرة ، أريد استخدام shelve وحدة. أنا أتساءل عما إذا كان القيام بذلك أمر معقول. هل يتصرف قاموس الرفى هو نفسه تمامًا مثل القاموس القياسي؟ إذا لم يكن كذلك ، كيف يختلف؟

هل كانت مفيدة؟

المحلول

لا يتصرف شيف على نفس القاموس ، لا سيما عند تعديل الكائنات الموجودة بالفعل في القاموس.

الفرق هو أنه عند إضافة فئة إلى قاموس يتم تخزين مرجع ، ولكن يحتفظ شيف بنسخة مخلل (متسلسل) من الكائن. إذا قمت بعد ذلك بتعديل الكائن ، فستقوم بتعديل النسخة في الذاكرة ، ولكن ليس الإصدار المخلل. يمكن التعامل معها (في الغالب) بشفافية shelf.sync() و shelf.close()التي تكتب الإدخالات. إن جعل كل هذا العمل يتطلب تتبع جميع الكائنات التي تم استردادها والتي لم تتم كتابتها مرة أخرى حتى لا تضطر إلى الاتصال بـ shelf.sync () لمسح ذاكرة التخزين المؤقت.

المشكلة مع shelf.sync() إن مسح ذاكرة التخزين المؤقت هو أنه يمكنك الاحتفاظ بالإشارة إلى الكائن وتعديله مرة أخرى.

لا يعمل هذا الرمز كما هو متوقع مع الرف ، لكنه سيعمل مع قاموس:

s["foo"] = MyClass()
s["foo"].X = 8 
p = s["foo"] # store a reference to the object
p.X = 9 # update the reference
s.sync() # flushes the cache
p.X = 0
print "value in memory: %d" % p.X # prints 0
print "value in shelf: %d" % s["foo"].X # prints 9

تزامن ذاكرة التخزين المؤقت حتى يتم فقدان كائن "P" المعدل من ذاكرة التخزين المؤقت بحيث لا يتم كتابته مرة أخرى.

نصائح أخرى

نعم إنه كذلك معقول:

تدعم كائنات الرف جميع الطرق التي تدعمها القواميس. هذا يخفف من الانتقال من البرامج النصية القائمة على القاموس إلى تلك التي تتطلب تخزينًا مستمرًا.

تحتاج إلى الاتصال shelf.sync() في كثير من الأحيان لمسح ذاكرة التخزين المؤقت.

تعديل

اعتن بنفسك ، إنها ليست بالضبط dict. انظر إجابة EG Laurion.

أوه ، ويمكنك فقط الحصول عليها str مفاتيح.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top