2009-03-15 19 views
5

स्थिति यह है: 14 2 9 4 508 हस्ताक्षरित पूर्णांक और 13 994 397 फ्लोटिंग-पॉइंट नंबर वाली फ़ाइल है (double एस पढ़ने की आवश्यकता है)। कुल फ़ाइल आकार ~ 250 एमबी है।सी ++ में स्ट्रीम से तेजी से स्वरूपित इनपुट कैसे करें?

std::istream का उपयोग ~ 30sec लेता है। फ़ाइल से मेमोरी में डेटा पढ़ना (केवल प्रारूपित इनपुट के बिना बाइट्स कॉपी करना) बहुत तेज़ है। फाइल प्रारूप को बदलने के बिना पढ़ने की गति में सुधार करने का कोई तरीका है?

+0

मुझे लगता है कि आपको अपना लूप कोड – Ben

+0

पोस्ट करना चाहिए यदि यह एमएसवीसी libs है तो आप जांच कर सकते हैं कि आप SECURE_SCL (डिफ़ॉल्ट रूप से) से कितना जुर्माना लगा रहे हैं। हालांकि, इसे बंद करने के प्रभावों को समझने के लिए सावधानी बरतें। – Functastic

+0

क्षमा करें, यह होना चाहिए: _SECURE_SCL – Functastic

उत्तर

3

क्या आपको एसटीएल शैली i/o का उपयोग करने की आवश्यकता है? आपको विशेषज्ञों में से एक से this उत्कृष्ट काम का पता लगाना चाहिए। यह डाइटमार कुहल द्वारा एक विशेष iostream है।

मुझे यह सुझाव देने से नफरत है लेकिन सी स्वरूपित i/o दिनचर्या पर नज़र डालें। साथ ही, क्या आप पूरी फाइल में एक बार में पढ़ रहे हैं?

+0

सिंटेक्स और दृष्टिकोण कोई फर्क नहीं पड़ता :) और हाँ, मैं पूरी फाइल पढ़ रहा हूं। –

+0

क्या आपने fscanf और दोस्तों को आजमाया है? मैं कहूंगा कि ये एक शॉट दें, और मापें। – dirkgently

1

तुम भी मैथ्यू विल्सन FastFormat पुस्तकालय को देखने के लिए चाहते हो सकता है:

मैं इसे इस्तेमाल नहीं किया है, लेकिन वह कुछ बहुत प्रभावशाली का दावा करता है और मैं एक बहुत कुछ मिल गया है अपने अन्य काम का अध्ययन करने और उपयोग करने (और अवसर पर चोरी) के लायक होने के लिए।

+0

क्या यह स्वरूपित इनपुट का समर्थन करता है? –

+0

बकवास - आप सही हैं ... यह केवल आउटपुट स्वरूपण है। –

+0

शायद तकनीक पर इनपुट लागू किया जा सकता है – dcw

1

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

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

1

अपने आप को पार्सिंग इनपुट (atoi & एटॉफ), आमतौर पर "सार्वभौमिक" पढ़ने के तरीकों की तुलना में कम से कम दो बार गति बढ़ाता है।

0

कुछ त्वरित और गंदी सिर्फ एक मानक सी ++ स्ट्रिंग में फ़ाइल डंप, और फिर उस पर एक stringstream उपयोग करने के लिए है:

#include <sstream> 
// Load file into string file_string 
std::stringstream s(file_string); 
int x; float y; 
s >> x >> y; 

यह आपको एक प्रदर्शन में सुधार की ज्यादा देना नहीं हो सकता है (यदि आप एक मिल जाएगा iostreams से परहेज करके बड़ी गति-अप), लेकिन कोशिश करना बहुत आसान है, और यह पर्याप्त तेज़ हो सकता है।

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