2009-12-18 17 views
9

में बड़ी फ़ाइलों के साथ काम मैं की सुविधा देता है सिर्फ इतना कहना, 4 बाइट तैरता की एक बड़ी फ़ाइल (4 gigs) है,। मैं इसे सूची के रूप में देखना चाहता हूं, इस अर्थ में कि मैं मानचित्र, फ़िल्टर, फोल्ड इत्यादि का उपयोग करने में सक्षम होना चाहता हूं। हालांकि, आउटपुट के साथ एक नई सूची बनाने के बजाय, मैं आउटपुट को वापस लिखना चाहता हूं फ़ाइल, और इस प्रकार केवल स्मृति में फ़ाइल का एक छोटा सा हिस्सा लोड करना होगा। आप कह सकते हैं कि मैं एक प्रकार किसी को भी इस स्थिति से पहले में भाग गया है MutableFileListहास्केल

कहा जाता है क्या? पहिया का पुन: आविष्कार करने के बजाय मैं सोच रहा था कि इससे निपटने के लिए हैकिश तरीका है या नहीं?

उत्तर

1

आप mmap का उपयोग स्मृति करने के लिए फ़ाइल को मैप करने के सकता है और उसके बाद इसे संसाधित। mmap module है जो read and write mmaped files का वादा करता है और फ़ाइलों के आलसी मैप किए गए हिस्सों के साथ भी काम कर सकता है, लेकिन मैंने कोशिश नहीं की है।

मैप किए गए फ़ाइल को लिखने के लिए इंटरफ़ेस काफी कम स्तर लगता है, इसलिए आपको Foreign.Ptr और इसी तरह के साथ अपना खुद का सार बनाना होगा या काम करना होगा।

+0

खिड़कियों पर 2 जीबी से अधिक फाइलों के साथ काम नहीं करेंगे। –

+0

@ जोनाथन: क्या आप वाकई काम नहीं करेंगे? प्रलेखन का कहना है कि मॉड्यूल 'CreateFileMapping' और' MapViewOfFile' का उपयोग करता है, जिनमें से 64 बिट्स फ़ाइल आकार/ऑफ़सेट पैरामीटर के लायक हैं, इसलिए उन API कॉल को किसी भी आकार की फ़ाइलों के लिए काम करना चाहिए (जैसे http://msdn.microsoft.com/ एन-यूएस/लाइब्रेरी/aa366761% 28VS.85, लाइटवेट% 29.aspx)। क्या मॉड्यूल किसी भी तरह से इस कार्यक्षमता को तोड़ता है? – sth

+0

@ ईमानदारी से मैं निश्चित रूप से नहीं जानता। मैं जा रहा हूँ जो मैंने नेट पढ़ा। मुझे इस साइट पर मेमोरी मैप की गई फ़ाइलों के बारे में धागे की सीमा मिली है। मैंने एमएसडीएन पर कुछ भी नहीं देखा जो आकार की आवश्यकताओं को किसी भी तरह से निर्दिष्ट करता है, लेकिन मुझे नहीं लगता कि एक प्रोग्राम 2 जीबी मेमोरी प्राप्त करने में सक्षम होगा, इससे कोई फर्क नहीं पड़ता कि आप इसे कैसे फिसलते हैं। मैं रिवर्स, फ़ाइल मैप किए गए मेमोरी की तरह :) :) –

9

This आप के लिए काफी मददगार होना चाहिए। आपको readFile और writeFile का उपयोग करने के लिए जो कुछ करना है, उसका उपयोग कर सकते हैं, और सबकुछ आलसी हो गया है। यह केवल तब भी चीजों को स्मृति में रखता है जब उनका उपयोग किया जा रहा है, ताकि आप अपने कंप्यूटर को उड़ाए बिना फ़ाइल को पढ़, संसाधित और लिख सकें।

+0

हम्म, मुझे एहसास नहीं हुआ कि मान स्मृति से बेदखल किए जाएंगे। ठीक है, मैं इसे एक शॉट दूंगा। –

12

आप एक [Double] या स्मृति में [Float] के रूप में यह इलाज नहीं करना चाहिए। आप क्या कर सकते हैं सूची में पैक किए गए सरणी प्रकारों में से एक का उपयोग करें, जैसे यूवेक्टर/वेक्टर/... एमएमएफ़फाइल या रीडफाइल के साथ कंपनी में एक समय में फ़ाइल के हिस्सों को खींचने के लिए, और उन्हें संसाधित करें। या आलसी पैक किए गए सरणी प्रकार का उपयोग करें, आलसी बाइटस्टेरिंग के बराबर।

+1

आप हास्केल समुदाय में जॉन स्कीट के रूप में प्रमुख बन रहे हैं। आप सिर्फ पोस्टिंग के लिए ऊपर उठ गए हैं। : p – Rayne