2012-09-18 25 views
6

में इसी तरह के विधि मैं Matlab R2011b चलाने के लिए और आर संस्करण 2.13.1 रैम 16 जीबी के साथ लिनक्स टकसाल v12 पर की तुलना में अत्यधिक रैम का उपयोग करता है।textscan आर

मैं एक csv फ़ाइल है। पहली 5 पंक्तियां (और शीर्षलेख) है:

#RIC,Date[G],Time[G],GMT Offset,Type,Price,Volume 
DAEG.OQ,07-JUL-2011,15:10:03.424,-4,Trade,1.68,1008 
DAEG.OQ,07-JUL-2011,15:10:03.424,-4,Trade,1.68,1008 
DAEG.OQ,07-JUL-2011,15:10:03.424,-4,Trade,1.66,300 
DAEG.OQ,07-JUL-2011,15:10:03.424,-4,Trade,1.65,1000 
DAEG.OQ,07-JUL-2011,15:10:03.464,-4,Trade,1.65,3180 

फ़ाइल बड़ी (लगभग 900 एमबी) है।

fid1 = fopen('/home/MyUserName/Temp/X.csv'); 
D = textscan(fid1, '%s%s%s%f%s%f%f', 'Delimiter', ',', 'HeaderLines', 1); 
fclose(fid1); 

हालांकि फ़ाइल 900MB है, जब ऊपर कोड चल रहा है, सिस्टम मॉनिटर इंगित करता है मेरी RAM उपयोग 2GB के बारे में से 10GB करने के लिए कूदता है: चरित्र और संख्यात्मक डेटा के संयोजन को देखते हुए, एक के रूप में इस matlab में इस फाइल को पढ़ सकता है । इससे भी बदतर, अगर मैं थोड़ी बड़ी सीएसवी फ़ाइल (लगभग 1.2 जीबी) के साथ इसी प्रक्रिया का प्रयास करता हूं तो मेरी रैम 16 जीबी पर अधिकतम हो जाती है और मैटलैब डेटा में पढ़ने को पूरा करने में कभी भी प्रबंधन नहीं करता है (यह सिर्फ "व्यस्त" मोड में फंस जाता है)।

अगर मैं आर में एक ही फाइल को पढ़ने के लिए चाहता था, मैं उपयोग कर सकते हैं:

D <- read.csv("/home/MyUserName/Temp/X.csv", stringsAsFactors=FALSE) 

इसमें कुछ समय मैटलैब से अधिक समय लेता है, लेकिन सिस्टम पर नजर रखने को इंगित करता है मेरी RAM उपयोग केवल 3.3GB के लिए 2GB से कूदता है (ज्यादा मूल फ़ाइल आकार दिया गया अधिक उचित)।

1) क्यों textscan है इस तरह के एक स्मृति इस परिदृश्य में हॉग:

मेरा प्रश्न के दो भाग हैं?

2) एक और दृष्टिकोण मैं रैम बाहर maxing के बिना अपने सिस्टम पर मैटलैब में इस प्रकार का एक 1.2GB csv फ़ाइल प्राप्त करने के लिए इस्तेमाल कर सकते हैं है?

संपादित करें: बस स्पष्ट करने के लिए, मैं करने के लिए कि क्या वहाँ एक matlab-एकमात्र समाधान मौजूद है के रूप में उत्सुक हूँ, यानी मैं एक समाधान है कि छोटे में csv फ़ाइल को तोड़ने के लिए एक अलग भाषा का उपयोग करना शामिल में कोई दिलचस्पी नहीं हूँ भाग (जैसा कि मैं पहले से ही कर रहा हूं)। क्षमा करें Trav1s, मुझे शुरुआत से यह स्पष्ट करना चाहिए था।

उत्तर

2

समस्या शायद कि उन "% s" तार मैटलैब cellstrs है, जो कम प्रमुखता स्ट्रिंग्स के लिए एक स्मृति-अकुशल डेटा संरचना कर रहे हैं करने के लिए पढ़ने के लिए जा रहा है। इस तरह के बड़े टैब्यूलर डेटा के लिए सेलस्टर्स लुसी हैं। प्रत्येक स्ट्रिंग एक अलग आदिम char सरणी में संग्रहीत हो जाती है, प्रत्येक में कुछ 400 बाइट ओवरहेड और विखंडन के मुद्दों के साथ होता है। आपकी 900 एमबी फ़ाइल के साथ, यह 18 मिलियन पंक्तियों की तरह दिखता है; प्रति पंक्ति 4 तार, और यह उन तारों को पकड़ने के लिए लगभग 10-20 जीबी सेलस्टर्स है। ओह।

क्या आप चाहते हैं कॉम्पैक्ट आदिम डेटाटाइप्स करने में उन लोगों के तार कन्वर्ट करने के लिए के रूप में वे में आ रहे हैं, बजाय हो रही सभी 18 लाख पंक्तियाँ एक बार में भारी सेल तार करने में slurped है। तिथियों और टाइमस्टैम्प के रूप में डेटनम या जो भी संख्यात्मक प्रतिनिधित्व आप उपयोग कर रहे हैं, और उन कम-कार्डिनालिटी या तो 2-डी char सरणी या कुछ स्पष्ट चर के बराबर हैं। (आपके डेटा सेट आकार को देखते हुए, आप शायद उन तारों को एक लुकअप टेबल के साथ सरल संख्यात्मक पहचानकर्ता के रूप में दर्शाते हैं, वर्ण नहीं।)

एक बार जब आप अपनी कॉम्पैक्ट डेटा संरचना पर निर्णय ले लेते हैं, तो इसे लोड करने के लिए कुछ दृष्टिकोण होते हैं। आप केवल शुद्ध मैटलैब में भाग में पढ़ने को तोड़ सकते हैं: textscan() कॉल को 1000 लाइनों में पढ़ने के लिए लूप में कॉल करें एक समय, पार्स और उस खंड में सेलस्टर्स को उनके कॉम्पैक्ट रूपों में परिवर्तित करें, सभी परिणामों को बफर करें, और पढ़ने के अंत में cat उन्हें एक साथ बदलें। वह चरम स्मृति आवश्यकताओं को कम रखेगा।

यदि आप इस तरह के बहुत सारे काम करने जा रहे हैं, और प्रदर्शन के मामले में, तो आप जावा पर उतरना चाहेंगे और अपना खुद का पार्सर लिख सकते हैं जो तारों और तिथियों को उनके हाथों में बदलने से पहले बदल सकता है अधिक कॉम्पैक्ट डेटाटाइप के रूप में Matlab पर वापस। यह मुश्किल नहीं है, और जावा विधि को सीधे मैटलैब से बुलाया जा सकता है, इसलिए यह एक अलग भाषा का उपयोग करने के रूप में केवल गिनती हो सकती है।

+0

धन्यवाद एंड्रयू, यह सवाल का एक अच्छा जवाब जैसा दिखता है, लेकिन मुझे कल तक विस्तार से पढ़ने का मौका नहीं मिलेगा (मैं काम पर हूं)। विलंब के लिए खेद है। –

+0

एंड्रयू, अच्छा जवाब +1, धन्यवाद। –

0

2 के लिए) आप csvread आदेश का उपयोग करने की कोशिश कर सकते हैं। मुझे नहीं पता कि प्रदर्शन कैसे तुलना करता है, लेकिन कम से कम यह एक विकल्प है।

एक अन्य विकल्प सी या awk की तरह एक बहुत तेजी से भाषा का प्रयोग कर फ़ाइल को पढ़ने, और फिर इसे तोड़ने छोटी फ़ाइलों में है। अनुक्रमिक रूप से कई छोटी फ़ाइलों को पढ़ना एक बड़ी फ़ाइल से कम स्मृति गहन होगा।

+0

हाय ट्रैव 1, सुझावों के लिए धन्यवाद। दुर्भाग्य से, csvread (या उस मामले के लिए dlmread) केवल पूरी तरह से संख्यात्मक डेटा के साथ काम करते हैं। इसलिए वे इस स्थिति में कोई अच्छा नहीं हैं (प्रश्न में मेरा नमूना डेटा देखें)। आपके दूसरे सुझाव के बारे में, वास्तव में मैं इस समय क्या कर रहा हूं, हालांकि मैं आर का उपयोग कर रहा हूं, सी नहीं, क्योंकि आर के लिए डेटा आयात फ़ंक्शन इतने डेटा गहन नहीं हैं। –