سؤال

أنا أستخدم berkdb لتخزين قائمة ضخمة من أزواج القيمة الرئيسية ولكن لسبب ما عندما أحاول الوصول إلى بعض البيانات لاحقًا أحصل على هذا الخطأ:

try:
    key = 'scrape011201-590652'
    contenttext = contentdict[key]
except:
    print the error


<type 'exceptions.KeyError'> 'scrape011201-590652' in 
contenttext = contentdict[key]\n', '  File "/usr/lib64/python2.5/bsddb/__init__.py",
line 223, in __getitem__\n    return _DeadlockWrap(lambda: self.db[key])  #   
self.db[key]\n', 'File "/usr/lib64/python2.5/bsddb/dbutils.py", line 62, in 
DeadlockWrap\n    return function(*_args, **_kwargs)\n', '  File 
"/usr/lib64/python2.5/bsddb/__init__.py", line 223, in <lambda>\n    return 
_DeadlockWrap(lambda: self.db[key])  # self.db[key]\n']

لست متأكدًا من ماهية DeadlockWrap ، لكن لا يوجد أي برنامج أو عملية أخرى تصل إلى Berkdb أو الكتابة إليها (على حد علمي) ، لذا لست متأكدًا من كيفية حصولنا على طريق مسدود ، إذا كان يشير إلى ذلك. هل من الممكن أن أحاول الوصول إلى البيانات بسرعة؟ لدي هذه الوظيفة دعوة في حلقة ، لذلك شيء مثل

for i in hugelist:
    #try to get a value from the berkdb
    #do something with it

أقوم بتشغيل هذا بمجموعات بيانات متعددة وهذا الخطأ يحدث فقط مع أحدهم ، وهو الأكبر ، وليس الآخرين.

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

المحلول

أنا متأكد جدا من DeadlockWrap الأشياء ليست ذات صلة هنا. إنها ببساطة وسيلة يوفر إعادة المحاولة تلقائيًا استراتيجية تراجع. بمعنى آخر ، إذا فشل معالجة قاعدة البيانات ، فإنه ينتظر قليلاً ثم يحاول مرة أخرى ، عدة مرات قبل فشله في النهاية.

يبدو أنك تحصل على ملف KeyError من قاموسك get العملية التي من المرجح أن تكون بسبب حقيقة أن المفتاح الذي تستخدمه غير موجود بالفعل في قاعدة البيانات.

جرب الرمز الخاص بك بشيء مثل:

try:
    key = 'scrape011201-590652'
    if not contentdict.has_key(key):
        print "Urk!, No record for %s"%(key)
    contenttext = contentdict[key]
except:
    print the error

هذا يجب أن يوضح لك إذا لم يكن السجل موجودًا في الجدول (عن طريق إخراج Urk! رسالة). فيما يتعلق بما تفعله في هذه الحالة ، يعتمد ذلك على بنيةك. ربما تريد العودة أيضًا None أو سلسلة فارغة. قد ترغب أيضًا في القيام بما تفعله الآن (رفع استثناء).

نصائح أخرى

contenttext = contentdict[key] if contentdict.has_key(key) else None
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top