मेरे पास कई टेक्स्ट फाइलें हैं, 50 कहें, मुझे एक बड़े डेटाफ्रेम में पढ़ने की जरूरत है। फिलहाल, मैं निम्नलिखित चरणों का उपयोग कर रहा हूं।मैं एकाधिक फ़ाइलों को पढ़ने और डेटा को डेटाफ्रेम में कैसे डाल सकता हूं?
- प्रत्येक फ़ाइल को पढ़ें और जांचें कि लेबल क्या हैं। मुझे जो जानकारी चाहिए वह अक्सर पहले कुछ पंक्तियों में निहित होती है। वही लेबल बस फाइल के बाकी हिस्सों के लिए दोहराते हैं, प्रत्येक बार उनके खिलाफ सूचीबद्ध विभिन्न प्रकार के डेटा के साथ।
- उन लेबलों के साथ डेटाफ्रेम बनाएं।
- फ़ाइल को फिर से पढ़ें और डेटाफ्रेम को मानों के साथ भरें।
- एक मास्टर डेटाफ्रेम के साथ उस डेटाफ्रेम को समेकित करें।
यह 100 केबी आकार के कुछ फ़ाइलों के लिए बहुत अच्छी तरह से काम करता है - कुछ मिनट, लेकिन 50 एमबी पर, इसमें बस घंटे लगते हैं, और व्यावहारिक नहीं है।
मैं अपना कोड कैसे अनुकूलित कर सकता हूं? विशेष रूप से -
- मैं कैसे पहचान सकता हूं कि कौन से फ़ंक्शन सबसे अधिक समय ले रहे हैं, जिसे मुझे अनुकूलित करने की आवश्यकता है? क्या यह फाइल का पठन है? क्या यह डेटा फ्रेम के लिए लेखन है? मेरा कार्यक्रम समय व्यतीत कहां है?
- क्या मुझे मल्टीथ्रेडिंग या मल्टीप्रोसेसिंग पर विचार करना चाहिए?
- क्या मैं एल्गोरिदम सुधार सकता हूं?
- शायद में पूरी फ़ाइल को पढ़ने के एक नहीं बल्कि लाइन द्वारा लाइन से एक सूची में जाने में,,
- पार्स में dataframe को हिस्सा/पूरी फ़ाइल में डेटा, बल्कि लाइन द्वारा लाइन से,
- असाइन डेटा पंक्ति से पंक्ति के बजाए भाग/एक जाना।
- क्या कोई और चीज है जो मैं अपना कोड तेजी से निष्पादित करने के लिए कर सकता हूं?
यहां एक उदाहरण कोड है। मेरा स्वयं का कोड थोड़ा अधिक जटिल है, क्योंकि टेक्स्ट फाइलें अधिक जटिल हैं जैसे कि मुझे लगभग 10 नियमित अभिव्यक्तियों और एकाधिक का उपयोग करना होता है जबकि डेटा को पढ़ने के लिए लूप और सही सरणी में सही स्थान पर आवंटित करते हैं। एमडब्ल्यूई को सरल रखने के लिए, मैंने MWE के लिए इनपुट फ़ाइलों में दोहराने वाले लेबल का उपयोग नहीं किया है, इसलिए मैं किसी भी कारण से फ़ाइल को दो बार पढ़ रहा हूं। मुझे उम्मीद है कि इसका कोई अर्थ है!
import re
import pandas as pd
df = pd.DataFrame()
paths = ["../gitignore/test1.txt", "../gitignore/test2.txt"]
reg_ex = re.compile('^(.+) (.+)\n')
# read all files to determine what indices are available
for path in paths:
file_obj = open(path, 'r')
print file_obj.readlines()
['a 1\n', 'b 2\n', 'end']
['c 3\n', 'd 4\n', 'end']
indices = []
for path in paths:
index = []
with open(path, 'r') as file_obj:
line = True
while line:
try:
line = file_obj.readline()
match = reg_ex.match(line)
index += match.group(1)
except AttributeError:
pass
indices.append(index)
# read files again and put data into a master dataframe
for path, index in zip(paths, indices):
subset_df = pd.DataFrame(index=index, columns=["Number"])
with open(path, 'r') as file_obj:
line = True
while line:
try:
line = file_obj.readline()
match = reg_ex.match(line)
subset_df.loc[[match.group(1)]] = match.group(2)
except AttributeError:
pass
df = pd.concat([df, subset_df]).sort_index()
print df
Number
a 1
b 2
c 3
d 4
मेरे इनपुट फाइलें:
test1.txt
a 1
b 2
end
test2.txt
c 3
d 4
end
शायद एक तेज डिस्क प्राप्त करें :) –
इस बीच, एक अच्छा पायथन प्रोफाइलर देखें। यह टूल का सामान्य वर्ग है जो आपको बताएगा कि कार्यक्रम का कौन सा हिस्सा बाधा है। –
क्या आप डेटाफ्रेम में पूरी 50 फाइलें नहीं पढ़ सकते हैं और फिर रेगेक्स आधारित मैनिपुलेशन चला सकते हैं? यह तेजी से होगा क्योंकि पांडा पर फ़िल्टर ऑपरेशंस बहुत तेज़ है .... – vks