سؤال

أنا أستخدم ZODB لتخزين بعض البيانات الموجودة في الذاكرة من أجل الثبات. إذا كانت الخدمة مع البيانات في الذاكرة في كل تعطل، فستحميل البيانات من ZODB بدلا من الاستعلام عن 100s من الآلاف من الصفوف في MySQL DB.

يبدو أنه في كل مرة أحفظ، قل 500K من البيانات إلى ملف قاعدة البيانات الخاص بي، ينمو ملف My.FS الخاص بي بواسطة 500K، بدلا من البقاء في 500K. كمثال:

storage     = FileStorage.FileStorage(MY_PATH)
db          = DB(storage)
connection  = db.open()
root        = connection.root()

if not root.has_key('data_db'):
    root['data_db'] = OOBTree()
mydictionary = {'some dictionary with 500K of data'}
root['data_db'] = mydictionary
root._p_changed = 1
transaction.commit()
transaction.abort()
connection.close()
db.close()
storage.close()

أريد الكتابة فوق البيانات المستمرة في الجذر ['data_db'] مع القيمة الحالية ذاتي. عندما أطبع Len (Root ['data_db']) دائما يطبع العدد الصحيح من العناصر من Mectictionary، ولكن في كل مرة يعمل فيها هذا الرمز (بنفس البيانات الدقيقة) زيادة حجم الملف بحجم البيانات، في هذه الحالة 500 كيلو.

أفعل شيئا خطأ هنا؟

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

المحلول

عندما تتغير البيانات الموجودة في ZODB، يتم إلحاق ذلك بنهاية الملف. البيانات القديمة تترك هناك. لتقليل الملفات، تحتاج إلى "حزمة" يدويا قاعدة البيانات.

جاءت جوجل هذه القائمة البريدية البريدية.

نصائح أخرى

منذ أن طلبت عن نظام تخزين آخر في تعليق، قد ترغب في النظر إلى SQLite.

على الرغم من أن SQLite يتصرف نفسه في إلحاق البيانات أولا، فإنه يوفر الأمر الفراغ لاستعادة مساحة التخزين غير المستخدمة. من بيثون API., ، سوف تستخدم إما استخدام فراغ براغما للقيام بذلك تلقائيا، أو يمكنك فقط تنفيذ قيادة الفراغ.

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