दिलचस्प पोस्ट
अजगर प्रिंट अंत = '' यूनिसेक यूनिकोड वर्णों के लिए उद्देश्य सी / कोको का उपयोग करना, अर्थात् \ u1234 ट्यूरिंग पूर्ण क्या है? पंक्ति से मूल्यों को निकालना स्पार्क पांडस प्रलेख में "प्रसारण" शब्द का क्या अर्थ है? एक जावास्क्रिप्ट ऑब्जेक्ट में चाबी के लिए एक चर का प्रयोग शाब्दिक वस्तु पायथन 2.x में प्रिंट () का उपयोग करना XMLHttpRequest स्थिति 0 (responseText खाली है) IOS5 में मौन मोड का पता लगा सकता है? जावास्क्रिप्ट पृष्ठभूमि में एजेएक्स प्रतिक्रियाओं को कैसे संभालता है? मॉड्यूल डिस्क्रिप्टर वर्ग को लोड करने में विफल: कक्षा "com.google.android.gms.dynamite.descriptors.com.google.firebase.auth.ModuleDescriptor" नहीं मिला एक सेट के माध्यम से संयोजित करने का एक अच्छा तरीका क्या है? SQL सर्वर स्ट्रिंग या बाइनरी डेटा को छोटा किया जाएगा क्या MYSQL LIMIT कीवर्ड के लिए एएनएसआई एसक्यूएल विकल्प है? सी # में यूआरआई स्ट्रिंग से फ़ाइल नाम प्राप्त करें

आर में पढ़ने के लिए एक विशाल (3.5 जीबी) सीएसवी फ़ाइल ट्रिम कर रहा है

इसलिए मेरे पास एक डेटा फ़ाइल (अर्धविराम अलग है) है जिसमें बहुत सारी विवरण और अपूर्ण पंक्तियाँ हैं (अग्रणी पहुंच और एसक्यूएल को गला घोंटना)। यह काउंटी स्तर के डेटा को 40 वर्षों के लिए खंडों, उप-खंडों और उप-उप खंडों (कुल ~ 200 कारकों के लिए) में विभाजित किया गया है संक्षेप में, यह बहुत बड़ा है, और अगर मैं बस इसे पढ़ने की कोशिश करता हूं, तो यह स्मृति में फिट नहीं होगा।

तो मेरा सवाल यह है, कि मैं सभी काउंटियों चाहता हूँ, लेकिन केवल एक साल (और केवल खंड का उच्चतम स्तर … जो अंत में लगभग 100,000 पंक्तियों के लिए आगे बढ़ता है), मिलने के बारे में सबसे अच्छा तरीका क्या होगा आर में यह रोलअप?

वर्तमान में मैं अजगर के साथ अप्रासंगिक वर्षों काटना करने की कोशिश कर रहा हूं, एक समय में एक पंक्ति पर पढ़कर और संचालन करके फाईलिज़ सीमा के आसपास हो रही है, लेकिन मैं आर-केवल समाधान (सीआरएएन पैकेज ओके) को पसंद करना चाहता हूं। क्या आर में एक समय में फाइलें एक टुकड़े में पढ़ने का एक समान तरीका है?

किसी भी विचार की बहुत प्रशंसा की जाएगी।

अद्यतन करें:

  • प्रतिबन्ध
    • मेरी मशीन का उपयोग करने की आवश्यकता है, इसलिए कोई ईसी 2 उदाहरण नहीं है
    • संभव के रूप में आर केवल के रूप में इस मामले में गति और संसाधनों की कोई चिंता नहीं है … बशर्ते मेरी मशीन में विस्फोट नहीं हो रहा है …
    • जैसा कि आप नीचे देख सकते हैं, डेटा में मिश्रित प्रकार हैं, जिन्हें मुझे बाद में संचालित करने की आवश्यकता है
  • डेटा
    • डेटा 3.5 जीबी है, जिसमें लगभग 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 से अधिक दो वर्ष (200 9 -2010 से 1 920-2020 तक) को चुनना चाहता हूं, ताकि डेटा आर में फिट हो सके:

 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 chokes।
  • मानचित्र छोटा करना
    • ईमानदार होने के लिए, दस्तावेज़ों ने मुझे इस पर थोड़ा सा भयभीत किया, इसलिए मैं इसे कोशिश करने के लिए चारों ओर नहीं मिला। ऐसा लगता है कि इस वस्तु को स्मृति में भी होना आवश्यक है, जो उस बिंदु को पराजित करेगा यदि वह मामला हो।
  • bigmemory
    • यह दृष्टिकोण डेटा से स्पष्ट रूप से जुड़ा हुआ है, लेकिन यह केवल एक समय में एक ही प्रकार का संचालन कर सकता है। नतीजतन, मेरे सभी चरित्र वैक्टर को गिरा दिया जब एक बड़ा दायरे में डाल दिया गया। अगर मुझे भविष्य के लिए बड़े डेटा सेट तैयार करने की आवश्यकता है, तो मैं केवल इस विकल्प को जीवित रखने के लिए संख्याओं का उपयोग करने पर विचार करूँगा
  • स्कैन
    • स्कैन में बड़ी स्मृति के समान प्रकार के मुद्दों थे, लेकिन readLines के सभी यांत्रिकी के साथ। संक्षेप में, यह सिर्फ इस समय बिल में फिट नहीं था

वेब के समाधान से एकत्रित समाधान "आर में पढ़ने के लिए एक विशाल (3.5 जीबी) सीएसवी फ़ाइल ट्रिम कर रहा है"

readLines साथ मेरी कोशिश करो एक कोड का यह टुकड़ा चयनित वर्षों के साथ csv बनाता है।

 file_in <- file("in.csv","r") file_out <- file("out.csv","a") x <- readLines(file_in, n=1) writeLines(x, file_out) # copy headers B <- 300000 # depends how large is one pack while(length(x)) { ind <- grep("^[^;]*;[^;]*; 20(09|10)", x) if (length(ind)) writeLines(x[ind], file_out) x <- readLines(file_in, n=B) } close(file_in) close(file_out) 

क्या आर में एक समय में एक टुकड़े फाइल में पढ़ने का एक समान तरीका है?

हाँ। ReadChar () फ़ंक्शन अक्षरों के एक ब्लॉक में पढ़े बिना मान ली जाएगी कि वे समाप्त हो चुके हैं। यदि आप एक समय में डेटा को पढ़ने के लिए चाहते हैं तो आप readLines () का उपयोग कर सकते हैं। यदि आप एक ब्लॉक या एक पंक्ति पढ़ते हैं, तो आप एक ऑपरेशन करते हैं, तो डेटा को लिखिए, आप स्मृति समस्या से बच सकते हैं। यद्यपि आप अमेज़ॅन के ईसी 2 पर एक बड़ी मेमोरी आवृत्ति को फायरिंग की तरह महसूस करते हैं, तो आप 64 जीबी रैम तक पहुंच सकते हैं। उसमें डेटा को हेरफेर करने के लिए अपनी फ़ाइल को और बहुत सारे कमरे में रखना चाहिए।

यदि आपको और अधिक गति की आवश्यकता है, तो शेन कमीशन का उपयोग करने की सिफारिश की सिफारिश बहुत अच्छी है हालांकि यदि आप ईसी 2 पर एक बड़ी मेमोरी आवृत्ति का उपयोग करने के मार्ग पर जाते हैं तो आपको मशीन पर सभी कोर का उपयोग करने के लिए मल्टीकोर पैकेज देखना चाहिए।

यदि आप खुद को सीमांकित डेटा के कई गिटों को आर में पढ़ना चाहते हैं तो आपको कम से कम sqldf पैकेज की खोज करनी चाहिए जो आपको सीधे सीआरडीएलडी से आयात करने की अनुमति देता है और फिर आर के भीतर से डेटा पर काम कर सकता है। मैंने sqldf को एक आर में आंकड़ों के आयात को आयात करने के सबसे तेज़ तरीके हैं, जैसा कि पिछले प्रश्न में बताया गया है।

मैं इस पर एक विशेषज्ञ नहीं हूं, लेकिन आप MapReduce पर विचार करने पर विचार कर सकते हैं, जिसका मूल रूप से "विभाजन और जीत" दृष्टिकोण लेने का मतलब होगा। इसके लिए कई विकल्प हैं, जिनमें शामिल हैं:

  1. mapReduce (शुद्ध आर)
  2. RHIPE (जो Hadoop का उपयोग करता है); सबसेटिंग फाइलों के उदाहरण के लिए दस्तावेज़ीकरण में उदाहरण 6.2.2 देखें

वैकल्पिक रूप से, आर बड़े डेटा से निपटने के लिए कई पैकेज प्रदान करता है जो कि बाहर की स्मृति (डिस्क पर) हो। संभवत: आप संपूर्ण डेटासेट को एक bigmemory वस्तु वस्तु में लोड कर सकते हैं और आर के भीतर पूरी तरह से कमी कर सकते हैं। http://www.bigmemory.org/ इस संभाल के लिए उपकरण के एक सेट के लिए

बड़ी फ़ाइलों से निपटने के लिए ff पैकेज एक पारदर्शी तरीका है।

आप पैकेज वेबसाइट और / या इसके बारे में एक प्रस्तुति देख सकते हैं।

आशा है कि ये आपकी मदद करेगा

आप SQLite डेटाबेस में डेटा आयात कर सकते हैं और फिर उपसेट का चयन करने के लिए RSQLite का उपयोग कर सकते हैं।

कॉलिबेल नामक एक नया पैकेज है जो आपको अत्यधिक पाठ फ़ाइलों में से केवल इच्छित चर में पढ़ा देता है:

http://colbycol.r-forge.r-project.org/

यह readable के साथ किसी भी तर्क को गुजरता है, इसलिए संयोजन आपको सबसे सब्सट को कस कर देना चाहिए।

क्या आप बड़ी स्मृति को बढ़ावा देते हैं ? यह देखें और यह ।

readr और read_*_chunked readr हुए readr का उपयोग करने के बारे में क्या?

तो आपके मामले में:

testfile.csv

 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 lol Ada County;NC;2013;1;FIRE;Financial;Banks;82.5 

वास्तविक कोड

 require(readr) f <- function(x, pos) subset(x, Year %in% c(2009, 2010)) read_csv2_chunked("testfile.csv", DataFrameCallback$new(f), chunk_size = 1) 

यह प्रत्येक f को लागू करता है, कॉल नामों को याद रखना और अंत में फ़िल्टर्ड परिणाम जोड़ना। देखें ?callback जो इस उदाहरण का स्रोत है।

इसका परिणाम यह होगा:

 # A tibble: 2 × 8 County State Year Quarter Segment `Sub-Segment` `Sub-Sub-Segment` GDP * <chr> <chr> <int> <int> <chr> <chr> <chr> <dbl> 1 Ada County NC 2009 4 FIRE Financial Banks 801 2 Ada County NC 2010 1 FIRE Financial Banks 825 

आप chunk_size को भी बढ़ा सकते हैं लेकिन इस उदाहरण में केवल 4 लाइनें हैं

शायद आप एमएस एक्सेस सीमाओं से स्वयं को रोकने के लिए MySQL या PostgreSQL में माइग्रेट कर सकते हैं।

डीबीआई (सीआरएएन पर उपलब्ध) आधारित डेटाबेस कनेक्टर के साथ इन प्रणालियों में आर कनेक्ट करना काफी आसान है।

स्कैन () दोनों एक nlines तर्क और एक छोड़ तर्क है। क्या कोई कारण है कि आप उस समय का एक खंड में पढ़ने के लिए इसका उपयोग कर सकते हैं, यह देखने के लिए कि क्या यह उचित है, तारीख देख रहा है? अगर इनपुट फाइल को तिथि के अनुसार ऑर्डर किया जाता है, तो आप एक इंडेक्स को स्टोर कर सकते हैं जो आपको बताता है कि आपके स्किड और नीनलाइन होने चाहिए, जो कि भविष्य में प्रक्रिया को गति देगा।

ये दिन, 3.5 जीबी वास्तव में बड़ा नहीं है, मैं अमेज़ॅन क्लाउड पर 244 जीबी रैम (आर 3.8 एक्सलर्ज) के साथ $ 2.80 / घंटा के लिए एक मशीन तक पहुंच सकता हूं। बड़े-डेटा प्रकार के समाधानों का उपयोग करने की समस्या को हल करने के लिए आपको यह कितने घंटे लगेगा? आपका समय कितना कीमती है? हाँ, आपको एडब्ल्यूएस का उपयोग करने का पता लगाने में एक-दो घंटे लगेंगे- लेकिन आप एक फ्री टियर पर मूल बातें सीख सकते हैं, डेटा अपलोड कर सकते हैं और पहले 10 क पंक्तियों को आर जांच कर सकते हैं कि यह काम कर रहा है और फिर आप इसे काम कर सकते हैं बड़ी स्मृति आवृत्ति जैसे r3.8xlarge और इसे पढ़िए! बस मेरी 2 सी

अब, 2017, मैं स्पार्क और स्पार्क आर के लिए जाने का सुझाव दूंगा

  • सिंटैक्स एक सरल बल्कि dplyr- समान तरीके से लिखा जा सकता है

  • यह छोटे स्मृति (2017 के अर्थ में छोटा) के लिए काफी अच्छी तरह से फिट बैठता है

हालांकि, आरंभ करने के लिए यह एक डरावना अनुभव हो सकता है …

मैं डीबी के लिए जाता हूं और फिर डीबीआई के माध्यम से आपको आवश्यक नमूनों को निकालने के लिए कुछ प्रश्न पूछता हूं

कृपया 3,5 जीबी सीएसवी फाइल SQLite में आयात करने से बचें। या कम से कम दोहरा जांच लें कि आपका विशाल DB SQLite सीमा में फिट बैठता है, http://www.sqlite.org/limits.html

यह आपके पास एक बहुत बड़ा डीबी है अगर आपको गति की आवश्यकता होती है तो मैं माईएसक्यूएल के लिए जाता था लेकिन आयात को पूरा करने के लिए बहुत घंटे इंतजार करने के लिए तैयार रहें। जब तक आपके पास कुछ अपरंपरागत हार्डवेयर न हों या आप भविष्य से लिख रहे हों …

अमेज़ॅन के ईसी 2 आर और MySQL चलने वाले सर्वर को तत्काल के लिए भी एक अच्छा समाधान हो सकता है

मेरे दो नमनीय पैसे लायक