2008-12-12 10 views
6

मैं एनएचबेर्नेट के साथ काम कर रहा हूं और 2 मिलियन पंक्तियों को पुनः प्राप्त करने और संसाधित करने की आवश्यकता है। आदर्श रूप से, मैं प्रत्येक पंक्ति को संसाधित कर सकता हूं - एक समय में - एनएचबीर्नेट के बिना एक बार में सभी 2 मिलियन मेमोरी लोड हो रहा है (क्योंकि, आप जानते हैं, दर्द होता है)।क्या आईसीआरटीरिया का उपयोग करके एनएचबीर्नेट क्वेरी से आलसी आईन्यूमेरेबल प्राप्त करना संभव है?

मैं एक आईनेमरेबल प्राप्त करना चाहता हूं जो प्रत्येक पाठ के लिए डेटा रीडर को क्रमशः कॉल करेगा, इसलिए मैं डेटा को पढ़ने की प्रक्रिया को संसाधित कर सकता हूं - फिर इसे छोड़ दें। ऐसा करने से मैं स्मृति की बोतलबंद बचाता हूं, और परिणाम को तेजी से संसाधित करना शुरू करता हूं। मैं multithreading और/या PLinq के उपयोग के माध्यम से प्रदर्शन में सुधार भी कर सकता है।

क्या यह NHibernate के ICriteria के साथ संभव है? सब कुछ जो लौटाता है वह IList लगता है, और संग्रह संदर्भ को बंद करने से पहले पूरी तरह से लोड किया गया है। IENumerable के बजाय IList क्यों ?!

मेरा मतलब पारंपरिक अर्थ में "आलसी" नहीं है कि एनएचबीर्नेट बच्चे या अभिभावक वस्तुओं को लोड करने के संबंध में उपयोग करता है। मुझे आलसी आईन्यूमेरेबल का अर्थ है आईसीआरआईटरिया ऑब्जेक्ट से आईनेमरेबल प्राप्त करने का कोई मतलब है। ICriteria में केवल एक सूची() विधि है जो परिणामों को एक ArrayList में लोड करता है।

public IEnumerable<YourObject> GetALotOfRows() { 
    ..execute DataReader 
    while(..read..) { 
    yield return yourObject; 
    } 
} 

अब वी.एस. या nHibernate आसान नहीं है, अर्द्ध छद्म कोड के लिए खेद है:

+0

मैंने सोचा था कि जब आपने NHibernate में आलसी IENumerable किया था तो आप एक समय में डेटाबेस को एक पंक्ति से पूछना शुरू करते हैं। यदि आपको इतनी सारी पंक्तियों से निपटना है तो एडीओ.Net के डेटारेडर को छोड़ना आसान हो सकता है। – Min

उत्तर

1

आईसीआरटीरिया में कोई तरीका नहीं है जो एक आईनेमरेबल लौटाता है, लेकिन IQuery does

+0

क्या आईसीआरआईटरिया को IQuery में बदलने का कोई तरीका है? – TheSoftwareJedi

+0

AFAIK IQuery एचक्यूएल और एसक्यूएल (स्ट्रिंग-आधारित प्रश्न) और आईसीआरटीरिया के लिए है ... ठीक है, मानदंड, मुझे दोनों के बीच कोई पुल नहीं दिख रहा है। मुझे यह अजीब लगता है कि आईसीआरटीरिया एक गणना को लागू नहीं करता है ... –

+0

मुझे भी। मैं एनकॉन्ट्रिब से लिंक-एनएचबर्ननेट कोड का उपयोग कर रहा हूं, और वे एक आईसीआरटीरिया (उनके कोड को देखने के बाद) का उपयोग करके कार्यान्वित करते हैं।मैं कोशिश करूँगा और उनके बकवास ठीक करूँगा। कोई विचार जब NHibernate आधिकारिक तौर पर लिंक का समर्थन करेगा (मुझे पता है कि इसकी शुरुआत वहां है)। – TheSoftwareJedi

0

आप क्या करना चाहते क्या इसलिए की तरह एक विधि में अपने डेटा का उपयोग लपेटो है। लेकिन यहां कुंजी "उपज रिटर्न" का उपयोग करना है।

+0

मेरा मानना ​​है कि एनएचबीर्नेट के निष्पादन वक्तव्य ओपी की तरह आलसी नहीं है। – user7116

+0

जब ओपी ने कहा था कि मुझे लगता है कि वह कुछ ऐसा था जो SqlDataReader करता है। – Strelok

+0

यह वही है जो मैं चाहता हूं, लेकिन मैं जानना चाहता हूं कि NHHernate को मेरे लिए कैसे करें, या कम से कम इसका समर्थन करें। NHibernate मुझे एक IList हाथ .... वास्तव में, मैं लिंक से NHibernate (NContrib से) का उपयोग करें, लेकिन यह कोई फर्क नहीं पड़ता .... – TheSoftwareJedi

0

यह किस तरह का ऑपरेशन है कि आपको इसे पंक्ति से पंक्ति में करना है? मैं सिर्फ उत्सुक हूँ :)।

आप परिणाम पृष्ठ पर आज़मा सकते हैं - पहले 10, अगले 10 ... और इसी तरह से प्राप्त करें।

संपादित करें: तो तुम

Session.CreateCriteria(typeof(T)).SetFirstResult(0).SetMaxResults(1).UniqueResult<T>(); 
Session.CreateCriteria(typeof(T)).SetFirstResult(1).SetMaxResults(1).UniqueResult<T>(); 
Session.CreateCriteria(typeof(T)).SetFirstResult(2).SetMaxResults(1).UniqueResult<T>(); 

होता आप तस्वीर मिल, मुझे लगता है यह सबसे अच्छा तरीका है नहीं है, यह IEnumerable नहीं है ... लेकिन यह काम करेगा। आप SetMaxResults (10) या कुछ बड़ा भी कर सकते हैं, इसलिए एक समय में 1 भेजने के लिए नहीं।

+0

मैं परिणाम कैसे पेज ?! मैं जो कर रहा हूं वह एक HTTP क्लाइंट को CSV फ़ाइल के रूप में परिणाम स्ट्रीम कर रहा है। मैंने पहले ही सीएसवीस्ट्रीम लागू किया है, और यह एक समय में एक रिकॉर्ड को बदलने और लिखने का समर्थन करेगा। मुझे बस ऐसा करने के लिए एनएचबीर्नेट की जरूरत है। आईसीआरआईटीरिया से। :) – TheSoftwareJedi

+0

आईसीआरटीरिया से आईनेमरेबल प्राप्त करने की कोई विधि नहीं है। –

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

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