निकालें मैं निम्नलिखित है बड़े पाठ फ़ाइल इनपुट (~ 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})
है हालांकि str2double
str2num
की तुलना में पहले से ही तेज विकल्प है। दूसरा सबसे धीमा हिस्सा textscan
है।
प्रश्न अब है, क्या इस समस्या से निपटने का एक तेज़ तरीका है?
कृपया मुझे बताएं कि मुझे और स्पष्ट करना चाहिए या नहीं। और अगर मुझे कोई स्पष्ट समाधान नहीं देखा गया है तो मुझे माफ़ कर दो, मैं अभी तीन सप्ताह के लिए मैटलैब के साथ काम कर रहा हूं।
यह मेरे डेटा के लिए अच्छा काम किया। डबल रूपांतरण के लिए स्ट्रिंग के उपयोग से बचने के लिए समय 60% से कम हो जाता है! – Lukas