2013-01-16 17 views
14

मैं स्लिम का उपयोग करके एक बहुत बड़ी तालिका से सभी रिकॉर्ड लाने में सक्षम होना चाहता हूं। यदि मैं इसे फॉरच के माध्यम से करने या सूची लाने के लिए करने का प्रयास करता हूं; मुझे मेमोरी अपवाद से बाहर निकलना है।स्कैला स्लिम आलसी Fetch

क्या स्लिक या आलसी लोडिंग के साथ "कर्सर" का उपयोग करने का कोई तरीका है जो केवल उपयोग की जाने वाली मेमोरी की मात्रा को कम करने के लिए ऑब्जेक्ट लाता है?

+0

यह सुनिश्चित नहीं है कि क्यों ओओएम का पूर्वानुमान होगा, इसे केवल एक ही समय में एक तत्व को आगे बढ़ाना चाहिए। आप इसके बजाय तत्व() को आज़मा सकते हैं, जो एक बंद करने योग्य इटरेटर लौटाएगा। यदि यह ओओएम में भी परिणाम देता है, तो अपना शेष कोड पोस्ट करें। – Saish

+1

इस पर कोई अपडेट? – S0rin

उत्तर

6

सुनिश्चित नहीं हैं कि कर्सर द्वारा क्या मतलब है, लेकिन आप पृष्ठांकन का उपयोग कर आंशिक डेटा लाने कर सकते हैं:

query.drop(0).take(1000) will take the first 1000 records 

query.drop(1000).take(1000) will take from 1001 to 2000 lines of the table. 

लेकिन इस क्वेरी दक्षता अपने डेटाबेस पर निर्भर करेगा, अगर यह यह समर्थन करेंगे, यदि तालिका सही है अनुक्रमित।

val object = Objects.where(...).map(w => w).iterator() 

और एक GroupBy:

+1

हाँ मैंने सोचा कि, बात यह है कि मैं परिणामस्वरूप अगले रिकॉर्ड को पकड़ने के लिए 'fetchNext' की तरह कुछ चाहता था। ऐसा लगता है कि 'foreach' सभी परिणामों को एक सूची में लाता है (प्रक्रिया में स्मृति से बाहर चल रहा है)। शायद मैं पेजिनेशन तकनीक का उपयोग करके परिणामसेट का हिस्सा लाने के लिए अपना स्वयं का फ़ंक्शन कार्यान्वित कर सकता हूं। धन्यवाद –

+0

स्लिक [iterator] का उपयोग क्यों न करें (http://slick.typesafe.com/doc/1.0.1/api/index.html#scala.slick.util.CloseableIterator)? – matanster

+0

@matt अतीत में कभी-कभी, groundresult iterator एक बाह्य त्रुटि उत्पन्न कर रहा था, लेकिन मुझे लगता है कि यह समस्या हल हो गई है। इटरेटर में ले और ड्रॉप विधियां भी हैं, लेकिन मुझे लगता है कि आप अगले और हैनेक्स्ट विधियों का उपयोग करना चाहते हैं, है ना? – dirceusemighini

1

आप iterator का संयोजन है जो एक इटरेटर रिटर्न इस्तेमाल कर सकते हैं

val chunkSize = 1000 
val groupedObjects = objects.grouped(chunkSize) 
groupedObjects.foreach {objects => objects.par.map(h => doJob(h))} 

के रूप में इस answer

+0

आपने वैल ऑब्जेक्ट परिभाषा के अंत में एक एस को याद किया – dirceusemighini

0

dirceusemighini के जवाब में सुझाव है कि सही है। Query.list() के बारे में गलत धारणा के कारण कुछ दिनों पहले मैं इसी तरह की एक समस्या में भाग गया, इसलिए मैं कुछ और संदर्भ दे सकता हूं। Slick संदर्भ से:

"इनवॉकर विशेषता (या पैरामीटर रहित संस्करणों के लिए यूनिट इनवॉकर) में परिभाषित विधियों का उपयोग करके प्रश्नों को निष्पादित किया जाता है। क्वेरी से एक निहित रूपांतरण होता है, ताकि आप सीधे किसी भी क्वेरी को निष्पादित कर सकें। सबसे आम उपयोग परिदृश्य है किसी विशेष प्रकार के संग्रह के साथ एक सख्त संग्रह में सेट करना, जैसे किसी भी प्रकार का संग्रह "

यह वास्तव में सच है कि क्वेरी.सूची() स्मृति में पूर्ण परिणाम सेट लोड करता है । इस बात को ध्यान में रखते हुए, आप अपनी समस्या के लिए कई दृष्टिकोण प्राप्त कर सकते हैं।

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