2012-03-14 12 views
23

मेरे पास आर में काफी बड़ा डेटाफ्रेम है जिसे मैं एसपीएसएस को निर्यात करना चाहता हूं। इस फ़ाइल में पहली जगह में आर करने के लिए इसे आयात करने की कोशिश सिर दर्द का मुझे घंटे का कारण बना है, फिर भी मैं (एक चरित्र फ़ाइल में प्रदर्शित नहीं हो) और विकल्प comment.char="%" का उपयोग कर read.fwf() का उपयोग कर सफल हो गया fill= TRUE (यह एक निश्चित-चौड़ाई ASCII फ़ाइल था कुछ पंक्तियों के साथ सभी चर की कमी, त्रुटि संदेशों का कारण बनता है)।टेक्स्ट फ़ाइल में बड़े (3.9 मिल ऑब्जेक्ट) डेटा.फ्रेम निर्यात करने का सबसे प्रभावी तरीका?

वैसे भी, मेरे डेटा फ्रेम वर्तमान में 3,9 मिल टिप्पणियों और 48 चर (सभी चरित्र) के होते हैं। मैं इसे df2 <- df[1:1000000,] के साथ 0 xआदि के साथ 4 x 1 मिल ऑब्जेक्ट सेट में विभाजित करके काफी तेज़ी से फ़ाइल करने के लिए लिख सकता हूं, लेकिन कंप्यूटर लॉक होने के बिना पूरी फ़ाइल को एक स्वीप में नहीं लिख सकता और वापस आने के लिए हार्ड रीसेट की आवश्यकता नहीं है अप।

के बारे में कैसे आर वर्षों के लिए बड़े डेटासेट के लिए अनुपयुक्त है वास्तविक कहानियों को सुनने के बाद यह पहली बार मैं वास्तव में इस तरह की एक समस्या का सामना करना पड़ा है। मुझे आश्चर्य है कि क्या अन्य दृष्टिकोण हैं (फ़ाइल को सीधे डिस्क पर कम-स्तर "डंपिंग"? या क्या मेरे पास कुछ पैकेज अज्ञात हैं जो इस प्रकार की बड़ी फ़ाइलों को कुशलता से निर्यात कर सकते हैं?

उत्तर

7

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

उसने कहा, कुछ संभावनाएं हैं। आप फ़ाइल को डेटाबेस में निर्यात कर सकते हैं और फिर टेक्स्ट फ़ाइल में लिखने के लिए उस डेटाबेस की सुविधा का उपयोग कर सकते हैं। जेडी लांग का जवाब this question आपको बताता है कि इस तरह से फ़ाइलों में कैसे पढ़ा जाए; प्रक्रिया को उलटना बहुत मुश्किल नहीं होना चाहिए। वैकल्पिक रूप से bigmemory और ff पैकेज (जैसा कि डेवी द्वारा उल्लिखित) का उपयोग ऐसी फाइलें लिखने के लिए किया जा सकता है।

+0

हाय रिची, मुझे यकीन नहीं है कि 8 जीबी रैम इस डेटासेट के साथ भी "रैम पर छोटा" के रूप में योग्य है या नहीं। हालांकि, मैं जेडी लांग द्वारा सुझाए गए अनुसार 'sqldf()' का उपयोग करने के लिए देखूँगा क्योंकि मैं इसे अपने विश्लेषण में बहुत उपयोग कर रहा हूं। सूचक के लिए धन्यवाद! – jans

7

हालांकि मैं केवल बहुत बड़ी फ़ाइलों (10+ जीबी) पढ़ने के लिए इसका उपयोग करता हूं, मेरा मानना ​​है कि ff पैकेज में बहुत बड़े dfs लिखने के लिए कार्य हैं।

+0

मैंने अपने भाग्य को 'एफएफ()' के साथ करने की कोशिश की लेकिन इस्तेमाल किए गए वाक्यविन्यास से परेशान था। मेरे सिर को इसके चारों ओर लपेट नहीं सका और मूल डेटा सेट के सबसेट पर इसे आजमाने से मुझे समय-समय पर लाभ नहीं मिला। फिर भी धन्यवाद। – jans

7

ठीक है, वास्तव में बड़ी फ़ाइलों और अनुसंधान के साथ जवाब के रूप में अक्सर एक डेटाबेस के लिए इस तरह का काम ऑफलोड करने के लिए अपने सबसे अच्छा है,। एसपीएसएस में ओडीबीसी कनेक्टिविटी है, और RODBC आर से एसक्यूएल तक एक इंटरफ़ेस प्रदान करता है।

मैं ध्यान दें, कि मेरी जानकारी बाहर की जाँच करने की प्रक्रिया में है, मैं पकड़े जाते गया है।

24

1) यदि आपकी फ़ाइल सभी चरित्र तार हैं, तो यह write.table() का उपयोग करके बहुत तेज़ी से बचाता है यदि आप इसे पहले matrix पर बदलते हैं।

2) 1000000 पंक्तियों के बारे में कहें, लेकिन हमेशा एक ही फ़ाइल में, और तर्क append = TRUE का उपयोग करके इसे लिखें।

+1

वास्तव में चालाक समाधान। डेटा.फ्रेम के लिए काम नहीं करेगा जहां चर अलग-अलग प्रकार हैं, लेकिन निश्चित रूप से यहां एक अच्छा फिक्स है! –

+0

हे, मुझे लगभग समान आयामों के डेटा के साथ एक ही चीज़ करना था: आप अमेरिकी जन्म या मृत्यु माइक्रोडेटा के साथ काम नहीं करेंगे, क्या आप? –

+0

@ टिम राइफ: नहीं, लेकिन तरह, ये गाय जन्म और calving डेटा हैं :) – jans

13

अद्यतन

बाद मैट Dowle द्वारा व्यापक काम parallelizing और अन्य दक्षता में सुधार जोड़ने, fread अब write.csv की तुलना में तेजी के रूप में ज्यादा 15x के रूप में है। अधिक के लिए लिंक उत्तर देखें।


अब data.table एक fwrite समारोह ओटो Seiskari के योगदान के बारे में जो दो बार के रूप में तेजी से सामान्य रूप में write.csv के रूप में हो रहा है है। कुछ बेंचमार्क के लिए here देखें।

library(data.table) 
fwrite(DF, "output.csv") 

ध्यान दें कि पंक्ति के नाम बाहर रखा गया है, के बाद से data.table प्रकार उनमें से कोई फायदा नहीं बनाता है।

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