मेरे पास सी # (.NET 4.0) में लिखा गया एक .NET अनुप्रयोग है। इस एप्लिकेशन में, हमें फ़ाइल से एक बड़ा डेटासेट पढ़ना होगा और सामग्री को ग्रिड जैसी संरचना में प्रदर्शित करना होगा। इसलिए, इसे पूरा करने के लिए, मैंने फ़ॉर्म पर डेटाग्रिड व्यू रखा। इसमें 3 कॉलम हैं, सभी कॉलम डेटा फ़ाइल से आता है। प्रारंभ में, फ़ाइल में 600,000 रिकॉर्ड थे, जो डेटाग्रिड व्यू में 600,000 लाइनों के अनुरूप थे।बहुत बड़े डेटासेट से निपटने और बस समय लोड करने में
मुझे तुरंत पता चला कि, डेटाग्रिड व्यू इतने बड़े डेटा-सेट के साथ गिर गया है, इसलिए मैंने वर्चुअल मोड पर स्विच किया था। इसे पूरा करने के लिए, मैंने पहली बार फ़ाइल को 3 अलग-अलग सरणी (3 कॉलम के अनुरूप) में पढ़ा, और फिर सेलवैल्यूइडेड इवेंट आग लगती है, मैं सरणी से सही मान प्रदान करता हूं।
हालांकि, इस फ़ाइल में रिकॉर्ड की एक बड़ी (बड़ी!) संख्या हो सकती है, जैसा कि हम जल्दी से पता चला। जब रिकॉर्ड आकार बहुत बड़ा होता है, तो सभी डेटा को किसी सरणी में पढ़ना या सूची <> आदि, संभव नहीं है। हम जल्दी से स्मृति आवंटन त्रुटियों में भागते हैं। (स्मृति अपवाद से बाहर)।
हम वहां फंस गए, लेकिन फिर एहसास हुआ, डेटा को पहले एरे में क्यों पढ़ा जाए, क्यों सेलवैल्यूइडेड इवेंट की आग के रूप में मांग पर फ़ाइल नहीं पढ़ी? तो अब हम यही करते हैं: हम फ़ाइल खोलते हैं, लेकिन कुछ भी नहीं पढ़ते हैं, और सेलवैल्यूइडेड घटनाओं की आग के रूप में, हम पहले फ़ाइल में सही स्थिति में() खोजते हैं, और उसके बाद संबंधित डेटा पढ़ते हैं।
यह सबसे अच्छा है जिसके साथ हम आ सकते हैं, लेकिन, सबसे पहले यह काफी धीमा है, जो एप्लिकेशन को सुस्त बनाता है और उपयोगकर्ता के अनुकूल नहीं है। दूसरा, हम मदद नहीं कर सकते लेकिन सोचते हैं कि इसे पूरा करने के लिए एक बेहतर तरीका होना चाहिए। उदाहरण के लिए, कुछ बाइनरी संपादकों (जैसे एचएक्सडी) किसी भी फ़ाइल आकार के लिए अंधेरे से तेज़ हैं, इसलिए मैं जानना चाहता हूं कि यह कैसे प्राप्त किया जा सकता है।
ओह, और डेटाग्रिड व्यू के वर्चुअल मोड में हमारी समस्याओं में जोड़ने के लिए, जब हम फ़ाइल में पंक्तियों की उपलब्ध संख्या (पंक्ति 16.000.000) पर पंक्ति गणना सेट करते हैं, तो डेटाग्रिड व्यू के लिए कुछ समय लगता है खुद को शुरू करें। इस 'समस्या' के लिए कोई टिप्पणी भी सराहना की जाएगी।
धन्यवाद
हैलो जिम, टी, 4 डबल-परिशुद्धता फ्लोट के साथ एक संरचना है। तो, 4 * 8 * 16 एम = 512 एमबी डेटा। – SomethingBetter
मैंने .NET MemoryMappedFile का उपयोग करने का प्रयास किया, लेकिन जैसे ही आप एक दृश्य बनाते हैं, यह स्पष्ट रूप से फ़ाइल को स्मृति में लोड करने का प्रयास करता है, क्योंकि मुझे स्मृति अपवादों से बाहर निकलना पड़ता है। मैंने सोचा कि शायद MemoryMappedFile आंतरिक रूप से पृष्ठों तक डेटा तक पहुंच जाएगा और केवल आवश्यक पृष्ठों को स्मृति में लोड करेगा। – SomethingBetter
@ SomethingBetter: मुझे लगता है कि अगर आप 32-बिट मशीन पर हैं तो 512 एमबी एक समस्या है। यदि आप मेमोरी मैप की गई फ़ाइल का उपयोग करते हैं, तो आप पूरे फ़ाइल आकार से छोटी फ़ाइल में अपना विचार बनाना चाहेंगे। फिर आप डेटा के माध्यम से उपयोगकर्ता पेज के रूप में अपना दृश्य समायोजित करते हैं। –