आर

2012-12-28 31 views
5

में मौजूदा डेटाफ्रेम (आरडीएस) में नया डेटा संलग्न करें मेरे पास एक प्रतिलिपि है जो एक फ्लैट फ़ाइल के रूप में डेटा की निरंतर स्ट्रीम में पढ़ रही है। एक और स्क्रिप्ट इस फ्लैट फ़ाइल को उठाती है, कुछ पार्सिंग और प्रसंस्करण करता है, फिर परिणाम को डेटा के रूप में सहेजता है। आरडीएस प्रारूप में डेटा। यह तब सोता है, और प्रक्रिया को दोहराता है।आर

saveRDS(tmp.df, file="H:/Documents/tweet.df.rds") #saving the data.frame 

दूसरी ... वें यात्रा पर, मैं कोड केवल की प्रक्रिया नई लाइनों पिछले यात्रा के बाद से फ्लैट फ़ाइल को जोड़ा गया है। हालांकि, स्थायी डेटा फ्रेम में डेल्टा लाइनों को जोड़ने के लिए, मुझे इसे मूल रूप से ओवरराइट करने, इसे जोड़ने, जोड़ने और फिर इसे वापस सहेजना होगा।

df2 <- readRDS("H:/Documents/tweet.df.rds") #read in permanent      
tmp.df2 <- rbind(df2, tmp.df) #append new to existing 
saveRDS(tmp.df2, file="H:/Documents/tweet.df.rds") #save it 
rm(df2) #housecleaning 
rm(tmp.df2) #housecleaning 

यह दृष्टिकोण जोखिम भरा है, क्योंकि जब भी आरडीएस पढ़ने/लिखने के लिए खुला है, उस फ़ाइल को छूने के लिए इच्छुक किसी अन्य प्रक्रिया इंतजार करना पड़ता है। चूंकि आधार फ़ाइल बड़ी हो जाती है, जोखिम बढ़ता है।

क्या appendRDS (मुझे सचमुच पता नहीं है) की तरह कुछ है जो मैं चाहता हूं कि प्राप्त कर सकूं- एक डेटा फ्रेम को पुन: अद्यतन करना- फ़ाइल में सहेजा गया- जो पूर्ण प्रतिस्थापन के बजाय संलग्न करने का उपयोग करता है?

+0

अच्छा, मुझे लगता है कि आप पहली जगह में एक बुरी चीज कर रहे हैं। आप अपने पिछले डेटा को ओवरराइट कर रहे हैं, इस प्रकार प्रभावी रूप से पिछले संस्करणों को हटा रहे हैं। उस ने कहा, क्यों नहीं 'टेक्स्ट लिखने योग्य' के साथ टेक्स्ट फॉर्म (सीएसवी, उदा।) में अपना डेटा बचाएं, जो मौजूदा दस्तावेजों में शामिल होने की अनुमति देता है? –

+0

मैं वास्तव में पिछले डेटा को पिछले डेटा की एक प्रति के साथ नवीनतम रिकॉर्ड में rbind'd के साथ ओवरराइट कर रहा हूं। उम्मीद है कि शो का मेरा दूसरा ब्लॉक जो पुराने में पढ़ता है, नया जोड़ता है, पुराने + नए के साथ पुराने को ओवरराइट करता है। अब मैं write.table append विकल्प देखता हूं। मैं एक गैर देशी प्रारूप से दूर रहा था क्योंकि मुझे लगा कि यह प्रसंस्करण ओवरहेड में वृद्धि करेगा। लेकिन बेहतर स्थिरता के लिए उस चरण में थोड़ा अक्षमता से व्यापार करने के साथ मैं ठीक हो सकता हूं। –

+0

मुझे आश्चर्य है कि कुछ जादू के साथ? Serialize एक संलग्न समारोह बनाने के लिए इस्तेमाल किया जा सकता है। –

उत्तर

2

मुझे लगता है कि आप कनेक्शन का उपयोग करके अपनी प्रक्रिया की रक्षा कर सकते हैं, अगली प्रक्रिया खत्म होने से पहले इसे खोलना और बंद करना।

con <- file("tmp.rds") 
open(con) 
df <- readRDS(con) 
df.new <- rbind(df,df) 
saveRDS(df.new, con) 
close(con) 

अद्यतन:

अगर फाइल करने के लिए एक कनेक्शन खुला आप परीक्षण और यह बताती हैं कि आप संगामिति साथ समस्या हो रही थोड़ा के लिए प्रतीक्षा कर सकते हैं।

while(is.Open(con)) { # untested but something of this nature should work 
sys.Sleep(2) 
} 
+0

कृपया धन्यवाद। ऐसा लगता है कि यह एक ही स्क्रिप्ट के भीतर काम करेगा। क्या इससे बचने में मदद मिलेगी यदि एक और स्क्रिप्ट (यानी, एक और प्रक्रिया) एक ही समय में उसी आरडीएस तक पहुंच रही थी? मुझे डर है कि समेकन के साथ मेरा एकमात्र अनुभव डेटाबेस के साथ है, फाइलों के साथ नहीं। –

+0

@ ब्रैंडन-बेर्त्सेल्सन काम किया! '# pass1 चोर <- फाइल" (एच: /Documents/tweet.df.rds ") \t जबकि (isOpen (चोर)) { \t \t Sys.sleep (2) \t} \t खुला (चोर , "पश्चिम बंगाल") \t saveRDS (tmp.df, चोर) \t पास (चोर, type = "rw") #Pass एन चोर <- फाइल "(एच: /Documents/tweet.df.rds") \t जबकि (isOpen (चोर)) { \t \t Sys.sleep (2) \t} \t खुला (चोर, "rb") \t df2 <- readRDS (चोर) \t पास (चोर, type = "rw") \t tmp.df2 <- rbind (df2, tmp.df) \t \t चोर <- फाइल "(एच: /Documents/tweet.df.rds") \t जबकि (isOpen (चोर)) { \t \t Sys.sleep (2) \t} \t खुला (चोर, "पश्चिम बंगाल") \t saveRDS (tmp.df2, con) \t नज़दीक (con, type = "rw") ' शायद खुले/समापन में कुछ ओवरकिल हो सकता है, लेकिन मैं इसके साथ ठीक हूँ। –

1

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

यदि आप एक फ़ाइल के साथ रहना चाहते हैं लेकिन आरडीएस फ़ाइल से असंगत डेटा पढ़ने का जोखिम कम करते हैं, तो आप इसे पढ़ सकते हैं, परिशिष्ट परिचालन कर सकते हैं, और फिर इसे एक अस्थायी फ़ाइल में लिख सकते हैं और अस्थायी नाम बदल सकते हैं एक बार यह खत्म होने के बाद मूल नाम पर फ़ाइल करें। फिर कम से कम जोखिम की अवधि फ़ाइल के आकार पर निर्भर नहीं है। किसी मौजूदा नाम पर फ़ाइल का नाम बदलने पर मुझे विभिन्न फाइल सिस्टम द्वारा किस तरह की परमाणुता की गारंटी है, इस बारे में परिचित नहीं हूं, लेकिन यह संभवतः saveRDS द्वारा किए गए समय से बेहतर है।

+0

दिलचस्प विचार। सभी आरडीएस फाइलों को पढ़ने के लिए यह थोड़ा सा स्मिथिंग लेगा; और फिर ड्रॉप/नाम बदलने के लिए ओएस में पहुंच रहा है। चालाक, लेकिन मेरे धैर्य से परे;)। –

+0

आप एक ऐसा फ़ंक्शन लिख सकते हैं जो 'saveRDS' के लिए ड्रॉप-इन प्रतिस्थापन के रूप में काम करता है जो एक temp फ़ाइल और नामों को लिखता है। –