मैं एनएचबेर्नेट के साथ काम कर रहा हूं और 2 मिलियन पंक्तियों को पुनः प्राप्त करने और संसाधित करने की आवश्यकता है। आदर्श रूप से, मैं प्रत्येक पंक्ति को संसाधित कर सकता हूं - एक समय में - एनएचबीर्नेट के बिना एक बार में सभी 2 मिलियन मेमोरी लोड हो रहा है (क्योंकि, आप जानते हैं, दर्द होता है)।क्या आईसीआरटीरिया का उपयोग करके एनएचबीर्नेट क्वेरी से आलसी आईन्यूमेरेबल प्राप्त करना संभव है?
मैं एक आईनेमरेबल प्राप्त करना चाहता हूं जो प्रत्येक पाठ के लिए डेटा रीडर को क्रमशः कॉल करेगा, इसलिए मैं डेटा को पढ़ने की प्रक्रिया को संसाधित कर सकता हूं - फिर इसे छोड़ दें। ऐसा करने से मैं स्मृति की बोतलबंद बचाता हूं, और परिणाम को तेजी से संसाधित करना शुरू करता हूं। मैं multithreading और/या PLinq के उपयोग के माध्यम से प्रदर्शन में सुधार भी कर सकता है।
क्या यह NHibernate के ICriteria के साथ संभव है? सब कुछ जो लौटाता है वह IList लगता है, और संग्रह संदर्भ को बंद करने से पहले पूरी तरह से लोड किया गया है। IENumerable के बजाय IList क्यों ?!
मेरा मतलब पारंपरिक अर्थ में "आलसी" नहीं है कि एनएचबीर्नेट बच्चे या अभिभावक वस्तुओं को लोड करने के संबंध में उपयोग करता है। मुझे आलसी आईन्यूमेरेबल का अर्थ है आईसीआरआईटरिया ऑब्जेक्ट से आईनेमरेबल प्राप्त करने का कोई मतलब है। ICriteria में केवल एक सूची() विधि है जो परिणामों को एक ArrayList में लोड करता है।
public IEnumerable<YourObject> GetALotOfRows() {
..execute DataReader
while(..read..) {
yield return yourObject;
}
}
अब वी.एस. या nHibernate आसान नहीं है, अर्द्ध छद्म कोड के लिए खेद है:
मैंने सोचा था कि जब आपने NHibernate में आलसी IENumerable किया था तो आप एक समय में डेटाबेस को एक पंक्ति से पूछना शुरू करते हैं। यदि आपको इतनी सारी पंक्तियों से निपटना है तो एडीओ.Net के डेटारेडर को छोड़ना आसान हो सकता है। – Min