2010-09-29 41 views
5

मुझे 16 जीबी फ़ाइल का विश्लेषण करना है। मैं अनुक्रमिक रूप से fread() और fseek() का उपयोग कर फ़ाइल के माध्यम से पढ़ रहा हूं। क्या यह व्यवहार्य है? fread() ऐसी बड़ी फ़ाइल के लिए काम करेगा?बड़ी फ़ाइलों के लिए विफल विफल रहता है?

+0

क्या आप इस्तेमाल की जाने वाली भाषा को स्पष्ट कर सकते हैं? –

+0

मैं आगे बढ़ने वाला हूं और अनुमान लगाता हूं कि सी – wallacer

+0

फ़्रेड और फ़ेक भी किसी अन्य भाषा में मानकों के रूप में मौजूद है? – wallacer

उत्तर

2

यह इस बात पर निर्भर करता है कि आप क्या करना चाहते हैं। यदि आप स्मृति में पूरे 16 जीबी डेटा को पढ़ना चाहते हैं, तो संभावना है कि आप मेमोरी या एप्लिकेशन हीप स्पेस से बाहर हो जाएंगे।

इसके बजाय डेटा द्वारा खंड को पढ़कर पढ़ें और उन हिस्सों पर प्रसंस्करण करें (और जब किया जाता है तो मुक्त संसाधन)।

लेकिन, इसके अलावा, यह तय करें कि आप किस दृष्टिकोण को करना चाहते हैं (fread() या istream इत्यादि का उपयोग करके) और कुछ परीक्षण केस करें ताकि यह देखने के लिए कि आपके लिए कौन सा बेहतर काम करता है।

3

यदि सही ढंग से कार्यान्वित किया गया तो यह कोई समस्या नहीं होनी चाहिए। मैं अनुक्रमिक रूप से मानता हूं कि आप अलग-अलग हिस्सों में फ़ाइल को देख रहे हैं और अपनी फ़ाइल पॉइंटर को आगे बढ़ा रहे हैं।

चेक बाहर http://www.computing.net/answers/programming/using-fread-with-a-large-file-/10254.html

ऐसा लगता है कि वह आप के रूप में लगभग एक ही बात कर रहा था।

5

आप एक ऐसी भाषा का उल्लेख नहीं है, इसलिए मैं सी

ग्रहण करने के लिए मैं fread, लेकिन fseek और ftell के साथ कोई समस्या नहीं दिख रहा मुद्दों हो सकता है जा रहा हूँ।

वे फ़ंक्शन long int का उपयोग fpos_t या यहां तक ​​कि size_t जैसे कुछ बुद्धिमान की बजाय फ़ाइल स्थिति को पकड़ने के लिए डेटा प्रकार के रूप में करते हैं। इसका मतलब है कि वे 2 जीबी से अधिक फाइल पर काम करने में असफल हो सकते हैं, और निश्चित रूप से 16 जीबी फाइल पर असफल हो सकते हैं।

आपको यह देखने की ज़रूरत है कि long int आपके प्लेटफ़ॉर्म पर कितना बड़ा है। यदि यह 64 बिट्स है, तो आप ठीक हैं। यदि यह 32 है, तो फ़ाइल की शुरुआत से दूरी मापने के लिए ftell का उपयोग करते समय आपको समस्याएं होने की संभावना है।

इसके बजाय fgetpos और fsetpos का उपयोग करने पर विचार करें।

+0

टिप्पणी * ".. आप कानूनी रूप से 'ftell'' पर कॉल किए बिना गैर-शून्य 'fseek' ऑफ़सेट का उपयोग नहीं कर सकते हैं * * पाठ मोड में खोले गए फ़ाइलों के लिए केवल सत्य है। बाइनरी मोड में खोले गए फाइलें 'SEEK_SET' और' SEEK_CUR' का उपयोग मनमाने ढंग से ऑफसेट के साथ कर सकती हैं। – caf

+0

@caf: धन्यवाद। जैसा कि आपने सुझाव दिया है मेरा जवाब बदल दिया गया है। –

2

यदि आप एक पॉज़िक्स-आईएसएच सिस्टम पर हैं, तो आपको यह सुनिश्चित करना होगा कि आपने 64-बिट फ़ाइल ऑफ़सेट समर्थन के साथ अपना प्रोग्राम बनाया है। POSIX जरूरी है (या कम से कम अनुमति देता है, और अधिकांश सिस्टम इसे लागू करते हैं) उन फ़ाइलों पर आईओ ऑपरेशंस को अस्वीकार करने के लिए कार्यान्वयन, जिनका आकार off_t में फिट नहीं होता है, भले ही केवल आईओ किया जा रहा हो, अनुक्रमिक नहीं है।

लिनक्स पर, इसका मतलब है कि आपको gcc कमांड लाइन पर -D_FILE_OFFSET_BITS=64 का उपयोग करने की आवश्यकता है।

3

प्रतिक्रिया के लिए धन्यवाद। मुझे पता चला कि मैं गलत कहां जा रहा था। fseek() और ftell() 4 जीबी से बड़ी फ़ाइलों के लिए काम नहीं करते हैं। मैंने _fseeki64() और _ftelli64() का उपयोग किया और यह अभी ठीक काम कर रहा है।

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