इसलिए मुझे एक डेटा फ़ाइल (अर्धविराम अलग) मिली है जिसमें बहुत सारी डिटेल और अधूरी पंक्तियाँ हैं (प्रमुख एक्सेस और SQL को चोक करने के लिए)। यह काउंटी स्तर का डेटा सेगमेंट, सब-सेगमेंट और सब-सब-सेगमेंट (कुल ~ 200 कारकों के लिए) में 40 वर्षों से टूटा हुआ है। संक्षेप में, यह बहुत बड़ा है, और यदि मैं इसे केवल पढ़ने की कोशिश करता हूं तो यह स्मृति में फिट नहीं होगा।
तो मेरा सवाल यह है कि यह देखते हुए कि मैं सभी काउंटियों को चाहता हूं, लेकिन केवल एक वर्ष (और सिर्फ उच्चतम स्तर के खंड ... अंत में लगभग 100,000 पंक्तियों के लिए अग्रणी), क्या पाने के लिए सबसे अच्छा तरीका होगा इस रोलअप में आर?
वर्तमान में मैं अजगर के साथ अप्रासंगिक वर्षों को काटने की कोशिश कर रहा हूं, एक समय में एक पंक्ति में पढ़ने और संचालन करने से फाइल की सीमा के आसपास हो रही है, लेकिन मैं एक आर-केवल समाधान (सीआरएएन पैकेज ओके) पसंद करूंगा। क्या आर में एक समय में फ़ाइलों को एक टुकड़े में पढ़ने का एक समान तरीका है?
किसी भी विचार की बहुत प्रशंसा की जाएगी।
अपडेट करें:
- प्रतिबन्ध
- मेरी मशीन का उपयोग करने की आवश्यकता है , इसलिए कोई EC2 उदाहरण नहीं है
- आर-केवल के रूप में संभव है। इस मामले में गति और संसाधन चिंता का विषय नहीं हैं ... बशर्ते मेरी मशीन में विस्फोट न हो ...
- जैसा कि आप नीचे देख सकते हैं, डेटा में मिश्रित प्रकार होते हैं, जिन्हें मुझे बाद में संचालित करने की आवश्यकता होती है
- डेटा
- डेटा 3.5GB है, जिसमें लगभग 8.5 मिलियन पंक्तियाँ और 17 कॉलम हैं
- एक दो हज़ार पंक्तियाँ (~ 2k) विकृत हैं, जिसमें 17 के बजाय केवल एक कॉलम है
- ये पूरी तरह से महत्वहीन हैं और इन्हें गिराया जा सकता है
- मुझे केवल इस फ़ाइल में से ~ 100,000 पंक्तियों की आवश्यकता है (नीचे देखें)
डेटा उदाहरण:
County; State; Year; Quarter; Segment; Sub-Segment; Sub-Sub-Segment; GDP; ...
Ada County;NC;2009;4;FIRE;Financial;Banks;80.1; ...
Ada County;NC;2010;1;FIRE;Financial;Banks;82.5; ...
NC [Malformed row]
[8.5 Mill rows]
मैं कुछ कॉलमों को काटना चाहता हूं और 40 उपलब्ध वर्षों में से दो (1980-2020 तक 2009-2010) चुनना चाहता हूं, ताकि डेटा आर में फिट हो सके:
County; State; Year; Quarter; Segment; GDP; ...
Ada County;NC;2009;4;FIRE;80.1; ...
Ada County;NC;2010;1;FIRE;82.5; ...
[~200,000 rows]
परिणाम:
किए गए सभी सुझावों के साथ छेड़छाड़ करने के बाद, मैंने फैसला किया कि जेडडी और मर्क द्वारा सुझाए गए रीडलाइन, सबसे अच्छा काम करेंगे। मैंने मर्क को चेक दिया क्योंकि उसने एक नमूना लागू किया था।
मैंने अपने अंतिम उत्तर के लिए मारेक के कार्यान्वयन का थोड़ा अनुकूलित संस्करण यहां पुन: प्रस्तुत किया है, स्ट्रैप्लिट और बिल्ली का उपयोग करके केवल उन कॉलमों को रखना जो मुझे चाहिए।
यह भी ध्यान दिया जाना चाहिए यह है ज्यादा कम अजगर से कुशल ... के रूप में, अजगर 5 मिनट में 3.5GB फ़ाइल के माध्यम से chomps आर 60 के बारे में लेता है ... लेकिन अगर आपके पास आर है तो यह टिकट है।
## Open a connection separately to hold the cursor position
file.in <- file('bad_data.txt', 'rt')
file.out <- file('chopped_data.txt', 'wt')
line <- readLines(file.in, n=1)
line.split <- strsplit(line, ';')
# Stitching together only the columns we want
cat(line.split[[1]][1:5], line.split[[1]][8], sep = ';', file = file.out, fill = TRUE)
## Use a loop to read in the rest of the lines
line <- readLines(file.in, n=1)
while (length(line)) {
line.split <- strsplit(line, ';')
if (length(line.split[[1]]) > 1) {
if (line.split[[1]][3] == '2009') {
cat(line.split[[1]][1:5], line.split[[1]][8], sep = ';', file = file.out, fill = TRUE)
}
}
line<- readLines(file.in, n=1)
}
close(file.in)
close(file.out)
दृष्टिकोण द्वारा विफलता:
- sqldf
- यह निश्चित रूप से है कि मैं भविष्य में इस प्रकार की समस्या के लिए उपयोग करूंगा यदि डेटा अच्छी तरह से बनता है। हालांकि, अगर यह नहीं है, तो SQLite चुटकुले।
- मानचित्र छोटा करना
- ईमानदार होने के लिए, डॉक्स ने मुझे इस पर थोड़ा डरा दिया, इसलिए मैं इसे आज़माने के लिए तैयार नहीं हुआ। ऐसा लग रहा था कि इसके लिए ऑब्जेक्ट को मेमोरी में होना आवश्यक है, जो कि अगर ऐसा होता तो बिंदु को हरा देता।
- bigmemory
- यह दृष्टिकोण सफाई से डेटा से जुड़ा हुआ है, लेकिन यह केवल एक समय में एक प्रकार को संभाल सकता है। नतीजतन, मेरे सभी चरित्र वैक्टर जब एक big.table में डाल दिया गया। अगर मुझे भविष्य के लिए बड़े डेटा सेट डिजाइन करने की आवश्यकता है, तो मैं केवल इस विकल्प को जीवित रखने के लिए केवल संख्याओं का उपयोग करने पर विचार करूंगा।
- स्कैन
- लगता है कि स्कैन में बड़ी मेमोरी के समान प्रकार के मुद्दे थे, लेकिन रीडलाइन के सभी यांत्रिकी के साथ। संक्षेप में, यह इस बार बिल के लायक नहीं था।
sed
और / याawk
कट-डाउन संस्करण बनाने के लिए दूर हो सकते हैं जिसे आप सीधे पढ़ सकते हैं। चूँकि यह उत्तर से अधिक वर्कअराउंड है, इसलिए मैं इसे एक टिप्पणी के रूप में छोड़ दूँगा।