मुझे लगता है कि मैं गलत तरीके से प्लीयर का उपयोग कर रहा हूं। क्या कोई मुझे बता सकता है कि यह 'कुशल' प्लीयर कोड है या नहीं?प्लीयर इतनी धीमी क्यों है?
require(plyr)
plyr <- function(dd) ddply(dd, .(price), summarise, ss=sum(volume))
थोड़ा संदर्भ: मेरे पास कुछ बड़ी समेकन समस्याएं हैं और मैंने ध्यान दिया है कि वे प्रत्येक कुछ समय ले रहे थे। मुद्दों को हल करने की कोशिश में, मैं आर
में विभिन्न समेकन प्रक्रियाओं के प्रदर्शन में रूचि बन गया, मैंने कुछ समेकन विधियों का परीक्षण किया - और मुझे पूरे दिन इंतजार कर रहा था।
जब मुझे अंत में परिणाम मिल गए, तो मुझे प्लीयर विधि और दूसरों के बीच एक बड़ा अंतर मिला - जो मुझे लगता है कि मैंने कुछ गलत गलत किया है।
मैं कोड निम्नलिखित (मैंने सोचा था कि जब मैं उस पर था मैं नए dataframe पैकेज की जाँच चाहते हैं) भाग गया:
require(plyr)
require(data.table)
require(dataframe)
require(rbenchmark)
require(xts)
plyr <- function(dd) ddply(dd, .(price), summarise, ss=sum(volume))
t.apply <- function(dd) unlist(tapply(dd$volume, dd$price, sum))
t.apply.x <- function(dd) unlist(tapply(dd[,2], dd[,1], sum))
l.apply <- function(dd) unlist(lapply(split(dd$volume, dd$price), sum))
l.apply.x <- function(dd) unlist(lapply(split(dd[,2], dd[,1]), sum))
b.y <- function(dd) unlist(by(dd$volume, dd$price, sum))
b.y.x <- function(dd) unlist(by(dd[,2], dd[,1], sum))
agg <- function(dd) aggregate(dd$volume, list(dd$price), sum)
agg.x <- function(dd) aggregate(dd[,2], list(dd[,1]), sum)
dtd <- function(dd) dd[, sum(volume), by=(price)]
obs <- c(5e1, 5e2, 5e3, 5e4, 5e5, 5e6, 5e6, 5e7, 5e8)
timS <- timeBasedSeq('20110101 083000/20120101 083000')
bmkRL <- list(NULL)
for (i in 1:5){
tt <- timS[1:obs[i]]
for (j in 1:8){
pxl <- seq(0.9, 1.1, by= (1.1 - 0.9)/floor(obs[i]/(11-j)))
px <- sample(pxl, length(tt), replace=TRUE)
vol <- rnorm(length(tt), 1000, 100)
d.df <- base::data.frame(time=tt, price=px, volume=vol)
d.dfp <- dataframe::data.frame(time=tt, price=px, volume=vol)
d.matrix <- as.matrix(d.df[,-1])
d.dt <- data.table(d.df)
listLabel <- paste('i=',i, 'j=',j)
bmkRL[[listLabel]] <- benchmark(plyr(d.df), plyr(d.dfp), t.apply(d.df),
t.apply(d.dfp), t.apply.x(d.matrix),
l.apply(d.df), l.apply(d.dfp), l.apply.x(d.matrix),
b.y(d.df), b.y(d.dfp), b.y.x(d.matrix), agg(d.df),
agg(d.dfp), agg.x(d.matrix), dtd(d.dt),
columns =c('test', 'elapsed', 'relative'),
replications = 10,
order = 'elapsed')
}
}
परीक्षण 5e8 अप करने के लिए जाँच करने के लिए चाहिए था, लेकिन यह बहुत समय लगा - ज्यादातर प्लीयर के कारण। अंतिम तालिका 5e5 समस्या दिखाती है:
$`i= 5 j= 8`
test elapsed relative
15 dtd(d.dt) 4.156 1.000000
6 l.apply(d.df) 15.687 3.774543
7 l.apply(d.dfp) 16.066 3.865736
8 l.apply.x(d.matrix) 16.659 4.008422
4 t.apply(d.dfp) 21.387 5.146054
3 t.apply(d.df) 21.488 5.170356
5 t.apply.x(d.matrix) 22.014 5.296920
13 agg(d.dfp) 32.254 7.760828
14 agg.x(d.matrix) 32.435 7.804379
12 agg(d.df) 32.593 7.842397
10 b.y(d.dfp) 98.006 23.581809
11 b.y.x(d.matrix) 98.134 23.612608
9 b.y(d.df) 98.337 23.661453
1 plyr(d.df) 9384.135 2257.972810
2 plyr(d.dfp) 9384.448 2258.048123
क्या यह सही है? data.table
से प्लीयर 2250x धीमी क्यों है? और नए डेटा फ्रेम पैकेज का उपयोग क्यों नहीं किया?
सत्र जानकारी है:
> sessionInfo()
R version 2.15.1 (2012-06-22)
Platform: x86_64-apple-darwin9.8.0/x86_64 (64-bit)
locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] xts_0.8-6 zoo_1.7-7 rbenchmark_0.3 dataframe_2.5 data.table_1.8.1 plyr_1.7.1
loaded via a namespace (and not attached):
[1] grid_2.15.1 lattice_0.20-6 tools_2.15.1
अपेक्षाकृत सरल डेटा हेरफेर/एकत्रीकरण समस्याओं के लिए, मैं पाया है डेटा तालिका बहुत तेज किया जाना है। अगर यह ऐसा कर सकता है, तो मुझे आश्चर्य नहीं है कि यह स्पष्ट विजेता है। मैं इस पर टिप्पणी करने के लिए 'प्लीयर' के साथ पर्याप्त परिचित नहीं हूं। – Joshua
क्या आपने 'plyr' और' data.table' के लिए प्रलेखन देखा है? अगर मुझे सही याद है, 'plyr' आधार-'R' 'data.frame के साथ काम करता है। 'data.table' कुंजी कॉलम का उपयोग करके, और संपूर्ण रेडिक्स सॉर्टिंग का उपयोग करके एक संपूर्ण भिन्न प्रतिनिधित्व का उपयोग करता है। यह इस तरह से डेटाबेस की तरह है। –
मैंने देखा है - लेकिन इसे समझ नहीं सका। प्लीयर थोड़ा धीमा से अधिक है ... लागू परिवार, एजीजी, और बहुत जल्दी हैं - और वे आधार हैं। यही कारण है कि मुझे लगा कि मुझे प्लीयर के साथ कुछ रूकी त्रुटि करनी होगी। – ricardo