سؤال

ولقد تم تشغيل بعض التعليمات البرمجية البرمجة الحيوي (محاولة القوة الغاشمة، تدحض التخمين Collatz = P) وكنت تستخدم لتخزين ديكت أطوال سلاسل كنت قد حسبت بالفعل. ومن الواضح، أنه نفد من الذاكرة في مرحلة ما. هل هناك أي وسيلة سهلة لاستخدام بعض البديل من dict التي سوف أجزاء صفحة من نفسها إلى القرص عند تشغيله من الغرفة؟ من الواضح أنه سيكون أبطأ من مجرد ديكت في الذاكرة، وأنه من المحتمل أن ينتهي أكل بلدي مساحة القرص الصلب، ولكن هذا يمكن أن تنطبق على غيرها من المشاكل التي ليست عقيمة جدا.

وأدركت أن القاموس يستند إلى قرص هو الى حد كبير قاعدة بيانات، ولذا فإنني يدويا تنفيذ واحد باستخدام sqlite3، لكنني لم أفعل ذلك بأي شكل من الأشكال الذكية، وكان الامر يبدو في كل عنصر في DB في وقت واحد ... كان حول 300X أبطأ.

هل أذكى وسيلة لمجرد خلق بلدي مجموعة من dicts، والحفاظ على واحد فقط في الذاكرة في وقت واحد، وترحيل بها في بعض بطريقة فعالة؟

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

المحلول

ويتم تناول تجزئة على القرص عموما مع بيركلي DB أو شيئا من هذا القبيل - يتم إدراج العديد من الخيارات في في توثيق بيثون البيانات الثبات . يمكنك الجبهة مع مخبأ في الذاكرة، ولكن كنت اختبار ضد أداء الأصلي أولا؛ مع التخزين المؤقت نظام التشغيل في المكان الذي قد يخرج عن نفسه.

نصائح أخرى

وو3rd الطرف يشق الوحدة هي أيضا تستحق أن نلقي نظرة على. انها تشبه الى حد بعيد الرف في أنه يشبه ديكت كائن بسيط، ومع ذلك فإنه يمكن تخزين لمختلف الخلفيات (مثل ملف، SVN، وS3)، يوفر ضغط اختياري، وغير حتى threadsafe. انها وحدة قوية جدا

from shove import Shove

mem_store = Shove()
file_store = Shove('file://mystore')

file_store['key'] = value

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

ومجمع رقيقة أن يفعل الاستفسارات سكليتي في __getitem__ و__setitem__ ليست أكثر من الرمز إلى الكتابة.

الرف حدة قد تفعل ذلك. على أية حال، يجب أن تكون بسيطة لاختبار. بدلا من:

self.lengths = {}

والقيام به:

import shelve
self.lengths = shelve.open('lengths.shelf')

والصيد الوحيد هو أن مفاتيح الرفوف يجب أن تكون السلاسل، لذلك سيكون لديك ليحل محل

self.lengths[indx]

مع

self.lengths[str(indx)]

و(أفترض المفاتيح الخاصة بك ليست سوى الأعداد الصحيحة، كما في تعليقك إلى آخر تشارلز دافي)

وليس هناك التخزين المؤقت المضمنة في الذاكرة، ولكن نظام التشغيل الخاص بك قد نفعل ذلك لك على أي حال.

[في الواقع، وهذا ليس صحيحا تماما: يمكنك تمرير حجة "writeback = صحيح" على الخلق. والقصد من ذلك هو جعل القوائم تخزين شك فيه، والأمور قابلة للتغيير أخرى في الجرف يعمل بشكل صحيح. ولكن الآثار الجانبية غير أن القاموس كله مؤقتا في الذاكرة. وبما أن هذا تسبب في مشاكل بالنسبة لك، وربما ليس :-) فكرة جيدة]

ومع قليلا من يعتقد انه يبدو مثل هل يمكن الحصول على الرف وحدة أن تفعل ما تريد.

ولقد قرأت كنت تعتقد الرف بطيئة جدا وحاولت الإختراق ديكت الخاص بك باستخدام سكليتي.

وفعل آخر هذا أيضا:

http://sebsauvage.net/python/snyppets/index.html#dbdict

ويبدو فعال جدا (وsebsauvage هو المبرمج جيد جدا). ربما يمكن أن محاولة إعطائها؟

ويجب عليك تقديم أكثر من عنصر واحد في وقت واحد إذا كان هناك بعض ارشادي لمعرفة أي هي العناصر الأكثر احتمالا أن يتم استردادها بعد ذلك، و لا تنسى المؤشرات مثل تشارلز يذكر.

وأنا لم يحاول حتى الآن ولكن الهامستر DB واعد ويحتوي على واجهة بيثون.

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