2011-07-11 9 views
11

सूचियों के लिए पायथन मूल क्षमताओं, & शब्दकोश पूरी तरह से रॉक सेट करता है। क्या डेटा वास्तव में बड़ा होने पर देशी क्षमता का उपयोग जारी रखने का कोई तरीका है? समस्या जो मैं बहुत बड़ी सूचियों के मिलान (चौराहे) पर काम कर रहा हूं। मैंने अभी तक सीमाओं को धक्का नहीं दिया है - वास्तव में मुझे वास्तव में पता नहीं है कि सीमाएं क्या हैं - और डेटा के अपेक्षित होने के बाद बड़े पुनर्मूल्यांकन से आश्चर्यचकित नहीं होना चाहिए।क्या पाइथन सूची, सेट या डिक्शनरी को डेटाबेस का उपयोग करके अदृश्य रूप से कार्यान्वित किया जा सकता है?

यह गूगल एप इंजन की तरह कुछ है कि कोई व्यावहारिक पैमाने सीमा का विज्ञापन करता है पर तैनाती और देशी क्षमता का उपयोग कर इस बारे में वास्तव में लगता है कि हमेशा के लिए और नहीं के रूप में है जारी रखने के लिए उचित है?

क्या कोई पाइथन जादू है जो छिप सकता है कि सूची, सेट या डिक्शनरी एक डीबी में पायथन-प्रबंधित मेमोरी बनाम है या नहीं - इसलिए डेटा में भौतिक तैनाती को कोड में जो कुछ भी किया जाता है उससे अलग रखा जा सकता है?

आप कैसे, श्रीमान या सुश्री पायथन सुपर एक्सपर्ट, सूचियों के साथ सौदा करते हैं, डेटा वॉल्यूम बढ़ने के साथ & डिस्क्स सेट करते हैं?

+8

श्रीमान और सुश्री * पायथन सुपर विशेषज्ञ * * [पायथनिस्टस] (http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html) * कहा जाता है। ;-) – Aufwind

+0

यह असंभव नहीं है, अगर असंभव नहीं है, तो मनमाने ढंग से पाइथन ऑब्जेक्ट्स को क्रमबद्ध और deserialize करने के लिए, लेकिन पाइथन/जेसन या जो भी हो, int, str, list और dict की तरह पाइथन ऑब्जेक्ट्स का एक सबसेट जारी रखना आसान है। हालांकि डेटा दृढ़ता में केवल आपकी समस्या में एक छोटा सा हिस्सा होता है। हल करने की एक और समस्या यह है कि आपको डेटाबेस के साथ अपनी ऑब्जेक्ट को मैप करने के लिए किसी प्रकार का मैपर बनाना होगा। यदि आप पोस्टग्रेस्क्ल या माईएसक्यूएल जैसे रिलेशनल डेटाबेस का उपयोग कर रहे हैं, तो आप एसक्लाल्चेमी जैसे ओआरएम देख सकते हैं, लेकिन यदि आप केवल जीएई के बड़ेटेबल का उपयोग कर सकते हैं तो आपको अपना खुद का ओआरएम लिखना पड़ सकता है ... –

+1

@ ड्रस: आधिकारिक नहीं, और न ही कभी हो। अपने लिए, मैं एक सांप आकर्षक हूँ। –

उत्तर

8

मुझे यकीन नहीं है कि सूचियों के लिए मूल क्षमताओं का क्या मतलब है, & शब्दकोश सेट करता है। हालांकि, आप कुछ methods with special names को परिभाषित करके container types और sequence types अनुकरण करने वाले वर्ग बना सकते हैं। इसका मतलब है कि आप एक वर्ग बना सकते हैं जो एक सूची की तरह व्यवहार करता है, लेकिन एसक्यूएल डेटाबेस या जीएई डेटास्टोर में अपना डेटा स्टोर करता है। बस बोलते हुए, यह एक ओआरएम करता है। हालांकि, किसी डेटाबेस में ऑब्जेक्ट्स मैप करना बहुत जटिल है और संभवतः अपने स्वयं के ओआरएम का आविष्कार करना अच्छा नहीं है, लेकिन मौजूदा का उपयोग करना है।

मुझे डर लग रहा वहाँ कोई एक आकार फिट सभी समाधान है। विशेष रूप से जीएई किसी प्रकार का जादू परी धूल नहीं है जिसे आप स्केल करने के लिए अपने कोड पर छिड़का सकते हैं। स्केल करने वाले एप्लिकेशन को बनाने के लिए आपको कई सीमाएं ध्यान में रखना है। उनमें से कुछ सामान्य हैं, जैसे computational complexity, अन्य आपके कोड में चलने वाले पर्यावरण के लिए विशिष्ट हैं। उदा।GAE पर अधिकतम प्रतिक्रिया समय 30 सेकंड तक सीमित है और डेटास्टोर से पूछताछ करता है कि अन्य डेटाबेस पर अलग-अलग काम करता है।

आपकी विशिष्ट समस्या को जानने के बिना कोई ठोस सलाह देना मुश्किल है, लेकिन मुझे संदेह है कि जीएई सही समाधान है।

सामान्य रूप से, यदि आप बड़े डेटासेट के साथ काम करना चाहते हैं, तो आपको या तो इसे शुरुआत से ही ध्यान में रखना होगा या डेटासेट के रूप में आपको अपने कोड, एल्गोरिदम और डेटा संरचनाओं को फिर से काम करना होगा।

+1

30 सेकंड का अधिकतम प्रतिक्रिया समय केवल उपयोगकर्ता के सामने के अनुरोधों के लिए लागू होता है। ऑफ़लाइन अनुरोध 10 मिनट तक सीमित हैं, और बैकएंड में कोई निष्पादन सीमा नहीं है। –

+0

आप बिल्कुल सही हैं, स्पष्टीकरण के लिए धन्यवाद। –

+0

"सूचियों, सेटों और शब्दकोशों के लिए मूल क्षमताओं" का अर्थ क्या है (1) कि ये मूल डेटा प्रकार हैं, कुछ ऐसा नहीं जो मुझे अधिक आदिम प्रकारों से एक साथ रखना है, और (2) कि चौराहे के रूप में ऐसे समृद्ध उपकरण हैं , iterators, ज़िप, मानचित्र, कम आदि –

0

आप ORM उपयोग कर सकते हैं: वस्तु संबंधपरक मानचित्रण: एक वर्ग एक मेज हो जाता है, एक वस्तुओं एक पंक्ति हो जाता है। मुझे Django ORM पसंद है। आप इसे गैर-वेब ऐप्स के लिए भी उपयोग कर सकते हैं। मैंने इसे कभी भी जीएई पर इस्तेमाल नहीं किया, लेकिन मुझे लगता है कि यह संभव है।

+0

ऐप इंजन एक रिलेशनल डेटाबेस का उपयोग नहीं करता है, इसलिए नहीं, आप एक रिलेशनल मैपिंग का उपयोग नहीं कर सकते हैं। – geoffspear

+0

django-nonrel (http://www.allbuttonspressed.com/projects/django-nonrel) आपको जीएई के लिए ओआरएम मॉडल देता है जैसे कि SQL डेटाबेस के लिए। लेकिन AFAIK यह अभी भी प्रगति पर काम कर रहा है। – guettli

2

आप मेरे सपनों का वर्णन कर रहे हैं! हालांकि, मुझे लगता है कि आप इसे नहीं कर सकते हैं। मैं हमेशा पाइथन के लिए LINQ की तरह कुछ चाहता था लेकिन भाषा देशी डेटाबेस संचालन AFAIK के लिए पायथन वाक्यविन्यास का उपयोग करने की अनुमति नहीं देती है। यदि यह संभव होगा, तो आप सूचियों का उपयोग करके कोड लिख सकते हैं और फिर डेटाबेस से डेटा पुनर्प्राप्त करने के लिए उसी कोड का उपयोग कर सकते हैं।

मैं तुम्हें सलाह नहीं केवल सूचियों और सेटों में आधारित कोड का एक बहुत कुछ लिखने के लिए है क्योंकि यह यह एक स्केलेबल मंच के लिए स्थानांतरित करने के लिए आसान नहीं होगा। मैं आपको एक ओआरएम की तरह कुछ उपयोग करने की सलाह देता हूं। जीएई में भी its own ORM-like system है और आप SQLAlchemy और SQLObject जैसे अन्य लोगों का उपयोग कर सकते हैं उदा। SQLite।

दुर्भाग्य से, आप इस तरह के रूप में सूची comprehensions शानदार काम उपयोग नहीं कर सकते डेटाबेस से डेटा फिल्टर करने के लिए। निश्चित रूप से, आप डेटा को डीबी से प्राप्त करने के बाद फ़िल्टर कर सकते हैं लेकिन आपको अभी भी ऑब्जेक्ट पूछताछ के लिए कुछ SQL-like भाषा के साथ एक क्वेरी बनाने या डेटाबेस से बहुत सारी ऑब्जेक्ट्स लौटने की आवश्यकता होगी।

ओटीओएच, Buzhug है, जो पाइथन में लिखी एक उत्सुक गैर-रिलेशनल डेटाबेस सिस्टम है जो प्राकृतिक पायथन वाक्यविन्यास के उपयोग की अनुमति देता है। मैंने कभी इसका इस्तेमाल नहीं किया है और मुझे नहीं पता कि यह स्केलेबल है इसलिए मैं अपना पैसा इस पर नहीं डालूंगा। हालांकि, आप इसका परीक्षण कर सकते हैं और देख सकते हैं कि यह आपकी मदद कर सकता है या नहीं।

+0

बेशक आप इसे कर सकते हैं। आप एक वर्ग बना सकते हैं जो डेटाबेस से पढ़ता है और लिखता है, और यदि आप सभी विशेष नामित विधियों ('__getattr__', आदि) को लागू करते हैं तो आप इसे एक शब्दकोश या सूची की तरह व्यवहार कर सकते हैं। –

+0

निश्चित रूप से आप कर सकते हैं! लेकिन आपकी कक्षा डेटाबेस में विभिन्न आदेश नहीं भेजेगी। मेरा मतलब है, आप एक ऐसी कक्षा नहीं लिख सकते हैं जो '[डी डी डेटा = डी' नाम == "जॉन"] जैसे एसक्यूएल क्वेरी बनने के लिए एक सूची समझ लेती है जैसे डेटा चयन से 'चयन *। नाम = 'जॉन' और फिर क्वेरी परिणाम लौटाएं। चूंकि यह संभव नहीं है (कम से कम आसानी से नहीं) मैं ओपी को सूची संचालन पर भरोसा करने का सुझाव नहीं दूंगा यदि वह बहुत सारे डेटा का प्रबंधन करेगा। मैंने इसे स्पष्ट करने के लिए अपना प्रश्न अपडेट किया। – brandizzi

+0

@brandizzi यदि 'डेटा' में' __iter __() 'विधि है जो नामित tuples लौटाती है जिसका फ़ील्ड डेटाबेस के फ़ील्ड हैं तो यह वास्तव में संभव है। Http://docs.python.org/dev/py3k/reference/datamodel.html?highlight=data%20model#object.__iter__ और http://docs.python.org/dev/py3k/library/collections.html देखें # collections.namedtuple। यह मुश्किल नहीं होना चाहिए। – Evpok

संबंधित मुद्दे

 संबंधित मुद्दे