سؤال

لدي بعض البيانات المخزنة في ديسيبل أريد معالجتها. الوصول إلى DB بطيء بشكل مؤلم ، لذلك قررت تحميل جميع البيانات في القاموس قبل أي معالجة. ومع ذلك ، نظرًا للحجم الكبير للبيانات المخزنة ، أحصل على خطأ في الذاكرة (أرى أكثر من 2 العربات المستخدمة). لذلك قررت استخدام بنية بيانات القرص ، واكتشفت أن استخدام الرفوف هو خيار. إليك ما أفعله (رمز Pseudo Python)

def loadData():
    if (#dict exists on disk):
        d = shelve.open(name)
        return d
    else:
        d = shelve.open(name, writeback=True)
        #access DB and write data to dict
        # d[key] = value 
        # or for mutable values
        # oldValue = d[key]
        # newValue = f(oldValue)
        # d[key] = newValue 
        d.close()
        d = shelve.open(name, writeback=True)
        return d

لدي بضعة أسئلة،

1) هل أنا حقا بحاجة إلى الكتابة = صحيح؟ ماذا تعمل، أو ماذا تفعل؟

2) ما زلت أحصل على استثناء OutofMemory ، لأنني لا أمارس أي تحكم عند كتابة البيانات على القرص. كيف يمكنني فعل ذلك؟ حاولت القيام بمزامنة () كل قليلة التكرارات ولكن هذا لم يساعد أيضًا.

شكرًا!

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

المحلول

writeback=True يجبر الرف على الحفاظ على أي عنصر في الذاكرة يتم جلبه على الإطلاق ، واكتبه مرة أخرى عند إغلاق الرف. لذلك ، فإنه يستهلك المزيد من الذاكرة ، ويبطئ الإغلاق.

ميزة المعلمة هي أنك ، معها ، أنت لا تحتاج إلى الرمز الملتوي الذي تعرضه في تعليقك على العناصر القابلة للتغيير التي تعتبر Mutator طريقة - فقط

shelf['foobar'].append(23)

يعمل (إذا shelf تم فتحه مع تمكين الكتابة) ، على افتراض العنصر في المفتاح 'foobar' هي قائمة بالطبع ، في حين أنها ستكون بصمت عدم تعاون (ترك العنصر على القرص دون تغيير) إذا shelf تم فتحه بدون كتابة - في الحالة الأخيرة ، تحتاج فعليًا إلى الترميز

thelist = shelf['foobar']
thelist.append(23)
shekf['foobar'] = thelist

في روح تعليقك - وهو من الناحية الأسلوبية إلى حد ما من المشكله.

ومع ذلك ، لأنك نكون مع وجود مشاكل في الذاكرة ، أوصي بالتأكيد ليس باستخدام خيار الكتابة المشكوك فيه. أعتقد أنني أستطيع أن أسميها "مشكوك فيها" منذ أن كنت الشخص الذي اقترحه وأوله أولاً ، لكن ذلك كان منذ سنوات عديدة ، وقد توبت في الغالب - إنه لمزيد من الارتباك (كإثبات Q) يسمح بالأناقة والهدوء في نقل التعليمات البرمجية المكتوبة في الأصل للعمل مع الديكتات (والتي ستستخدم المصطلح الأول ، وليس الثاني ، وبالتالي تحتاج إلى إعادة كتابة من أجل أن تكون قابلة للاستخدام مع الرفوف دون تتبع). آه حسنًا ، آسف ، فعل تبدو فكرة جيدة في ذلك الوقت.

نصائح أخرى

باستخدام sqlite3 ربما تكون الوحدة النمطية أفضل خيارك هنا. قد تكون قادرًا على استخدام SQLite بالكامل في الذاكرة على أي حال لأن بصمة الذاكرة الخاصة بها قد تكون أصغر قليلاً من استخدام كائنات Python على أي حال. إنه خيار أفضل بشكل عام من استخدامه shelve على أي حال؛ shelve الاستخدامات pickle أسفل ، وهو نادرا ما تريد.

الجحيم ، يمكنك فقط تحويل قاعدة البيانات الحالية الخاصة بك إلى قاعدة بيانات SQLite. sqlite لطيف وسريع.

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