मैं आरएमओएनओडीबी के साथ काम कर रहा हूं और मुझे एक क्वेरी के मूल्यों के साथ एक खाली डेटा.फ्रेम भरना होगा। परिणाम काफी लंबे हैं, लगभग 2 मिलियन दस्तावेज़ (पंक्तियां)।धीमी डेटा। फ्रेम पंक्ति असाइनमेंट
जबकि मैं प्रदर्शन परीक्षण कर रहा था, मुझे पता चला कि डेटा फ्रेम के आयाम से पंक्तियों को लिखने का समय बढ़ता है। शायद यह एक प्रसिद्ध मुद्दा है और मैं इसे नोटिस करने वाला अंतिम व्यक्ति हूं।
कुछ कोड उदाहरण:
set.seed(20140430)
nreg <- 2e3
dfres <- as.data.frame(matrix(rep(NA,nreg*7),nrow=nreg,ncol=7))
system.time(dfres[1e3,] <- c(1:5,"a","b"))
summary(replicate(10,system.time(dfres[sample(1:nreg,1),] <- c(1:5,"a","b"))[3]))
nreg <- 2e6
dfres <- as.data.frame(matrix(rep(NA,nreg*7),nrow=nreg,ncol=7))
system.time(dfres[1e3,] <- c(1:5,"a","b"))
summary(replicate(10,system.time(dfres[sample(1:nreg,1),] <- c(1:5,"a","b"))[3]))
मेरी मशीन पर, 2 milion पंक्तियों data.frame 0.4 के बारे में सेकंड लेता है पर काम। अगर मैं पूरा डेटासेट भरना चाहता हूं तो यह बहुत समय है। इस मुद्दे को आकर्षित करने के लिए यहां एक दूसरा सिमुलेशन चला जाता है।
nreg <- seq(2e1,2e7,length.out=10)
te <- NULL
for(i in nreg){
dfres <- as.data.frame(matrix(rep(NA,i*7),nrow=i,ncol=7))
te <- c(te,mean(replicate(10,{r <- sample(1:i,1); system.time(dfres[r,] <- c(1:5,"a","b"))[3]})))
}
plot(nreg,te,xlab="Number of rows",ylab="Avg. time for 10 random assignments [sec]",type="o")
#rm(nreg,dfres,te)
प्रश्न: ऐसा क्यों होता है? क्या स्मृति में डेटा.फ्रेम भरने का कोई तेज तरीका है?
एक workarround: यह 1E4 पंक्तियों के साथ एक अस्थायी data.frame में पंक्तियों बताए जब तक यह भरा हुआ है में होते हैं। फिर मैं इसे अंतिम डेटा के साथ जोड़ता हूं। फ्रेम और छोटे को फिर से भरें। – Emer