2013-10-03 5 views
5

निकालें मैं निम्नलिखित है बड़े पाठ फ़ाइल इनपुट (~ 500k लाइनों) और बाद को पार्स डेटा के विषय में प्रदर्शन मुद्दाबढ़ाया प्रदर्शन के साथ पाठ फ़ाइल से reoccuring लाइनों

एक पाठ फ़ाइल data.txt pecularity साथ निम्नलिखित अनुकरणीय संरचना कि दो हैडर लाइनों पाठ फ़ाइल में कहीं फिर से प्रकट होना कर सकते हैं पर विचार करें:

Name Date Val1 val2 
--- ------- ---- ---- 
BA 2013-09-07 123.123 1232.22 
BA 2013-09-08 435.65756 2314.34 
BA 2013-09-09 234.2342 21342.342 

कोड मैंने लिखा और जो काम कर रहा है है निम्नलिखित :

%# Read in file using textscan, read all values as string 

inFile = fopen('data.txt','r'); 
DATA = textscan(inFile, '%s %s %s %s'); 
fclose(inFile); 

%# Remove the header lines everywhere in DATA: 
%# Search indices of the first entry in first cell, i.e. 'Name', and remove 
%# all lines corresponding to those indices 

[iHeader,~] = find(strcmp(DATA{1},DATA{1}(1))); 
for i=1:length(DATA) 
    DATA{i}(iHeader)=[]; 
end 

%# Repeat again, the first entry corresponds now to '---' 

[iHeader,~] = find(strcmp(DATA{1},DATA{1}(1))); 
for i=1:length(DATA) 
    DATA{i}(iHeader)=[]; 
end 

%# Now convert the cells for column Val1 and Val2 in data.txt to doubles 
%# since they have been read in as strings: 

for i=3:4 
    [A] = cellfun(@str2double,DATA{i}); 
    DATA{i} = A; 
end 

मैं सब कुछ में पढ़ने के लिए के रूप में ओडर में एक स्ट्रिंग DATA में हर जगह हैडर लाइनों को दूर हटाने के लिए सक्षम होने के लिए चुना है।

समय को रोकने से मुझे पता चलता है कि कोड का सबसे धीमा हिस्सा रूपांतरण [A] = cellfun(@str2double,DATA{i}) है हालांकि str2doublestr2num की तुलना में पहले से ही तेज विकल्प है। दूसरा सबसे धीमा हिस्सा textscan है।

प्रश्न अब है, क्या इस समस्या से निपटने का एक तेज़ तरीका है?

कृपया मुझे बताएं कि मुझे और स्पष्ट करना चाहिए या नहीं। और अगर मुझे कोई स्पष्ट समाधान नहीं देखा गया है तो मुझे माफ़ कर दो, मैं अभी तीन सप्ताह के लिए मैटलैब के साथ काम कर रहा हूं।

उत्तर

4

आप CommentStyle बुलाया textscan का एक विकल्प है कि आपकी फ़ाइल (आपके मामले में बार-बार 2 headerlines) का हिस्सा छोड़ देगा, और एक समारोह कॉल में अपने फ़ाइल को पढ़ने का उपयोग कर सकते हैं। इस तरह के {'/*', '*/'} के रूप में एक स्ट्रिंग जैसे '%' एक ही पंक्ति, या दो तार के एक सेल सरणी पर स्ट्रिंग निम्न वर्णों की अनदेखी करने,, वर्णों के बीच की अनदेखी करने के:

doc says के रूप में, CommentStyle 2 तरीकों से किया जा सकता है दो तार (लाइनों के अंत सहित)। हम यहां दूसरे विकल्प का उपयोग करेंगे: Name और - के बीच वर्ण हटाएं। चूंकि अंतिम स्ट्रिंग में - वर्ण दोहराया गया है, इसलिए हमें संपूर्ण स्ट्रिंग निर्दिष्ट करने की आवश्यकता है।

inFile = fopen('data.txt','r'); 
DATA = textscan(inFile, '%s %s %f %f', ... 
     'Commentstyle', {'Name';'--- ------- ---- ----'}); 
fclose(inFile); 

आप datenum का उपयोग कर एक सार्थक संख्या में एक तारीख स्ट्रिंग बदल सकते हैं।

DATA_date = datenum(C{2}) 
+0

यह मेरे डेटा के लिए अच्छा काम किया। डबल रूपांतरण के लिए स्ट्रिंग के उपयोग से बचने के लिए समय 60% से कम हो जाता है! – Lukas

2

हालांकि लंबे समय तक यह बेहतर होगा यदि इससे बचने के लिए आपके डेटा अधिग्रहण को ठीक किया जा सके, तो आप टेक्सासैन में HeaderLines का लाभ उठा सकते हैं।

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

अगली बार textscan कहा जाता है, यह उस पंक्ति के बाकी हिस्सों और अगली पूरी लाइन को छोड़ देता है, फिर जारी रहता है (जब तक ईओफ़ या हेडर लाइनों का एक और सेट नहीं)। यदि आप फ़ाइल के अंत तक पहुंच गए हैं, तो textscan त्रुटि के बिना चलाएगा, लेकिन length(data{3}) शून्य होना चाहिए।

c3 = []; 
c4 = []; 
fid = fopen('data.txt'); 
data = textscan(fid,'%s %s %f %f','HeaderLines',2); 
l = length(data{3}); 
while l>0 %stop when we hit eof 
    c3 = [c3; data{3}]; 
    c4 = [c4; data{4}]; 
    data = textscan(fid,'%s %s %f %f','HeaderLines',2); 
    l = length(data{3}); 
end 
+0

मुझे यह दृष्टिकोण बहुत पसंद है। मैं @Magla द्वारा उत्तर की तुलना में इस दो (या gernerally एन) शीर्षलेख लाइनों से विशिष्ट की आवश्यकता नहीं है। मेरे कोड के लिए मैग्ला द्वारा समाधान लागू करने के लिए छोटा था इसलिए मैंने इसे सर्वश्रेष्ठ फिटिंग उत्तर के रूप में चुना। इसके अलावा, 'टिप्पणी स्टाइल' का उपयोग करके गति के मामले में 50% तेज है। – Lukas

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