Ich versuche, den schnellsten Weg zu finden, einen großen Datensatz durch mehrere numerische Spalten zu unterteilen. Wie von data.table versprochen, ist die für die binäre Suche benötigte Zeit viel schneller als beim Vektor-Scannen. Die binäre Suche erfordert jedoch, dass zuvor ein setkey ausgeführt wird. Wie Sie in diesem Code sehen, dauert es außergewöhnlich lange! Sobald Sie diese Zeit berücksichtigen, ist das Vektor-Scannen viel viel schneller:data.table: Vektor-Scan v binäre Suche mit numerischen Spalten - super-langsame setkey
set.seed(1)
n=10^7
nums <- round(runif(n,0,10000))
DT = data.table(s=sample(nums,n), exp=sample(nums,n),
init=sample(nums,n), contval=sample(nums,n))
this_s = DT[0.5*n,s]
this_exp = DT[0.5*n,exp]
this_init = DT[0.5*n,init]
system.time(ans1<-DT[s==this_s&exp==this_exp&init==this_init,4,with=FALSE])
# user system elapsed
# 0.65 0.01 0.67
system.time(setkey(DT,s,exp,init))
# user system elapsed
# 41.56 0.03 41.59
system.time(ans2<-DT[J(this_s,this_exp,this_init),4,with=FALSE])
# user system elapsed
# 0 0 0
identical(ans1,ans2)
# [1] TRUE
Mache ich etwas falsch? Ich habe die data.table FAQs usw. durchgelesen. Jede Hilfe würde sehr geschätzt werden.
Vielen Dank.
Durch das Festlegen eines Schlüssels wird Ihre data.table und mit diesen vielen eindeutigen Schlüsselwerten sortiert, was eine teure Operation darstellt. Es lohnt sich nicht, wenn Sie danach nur eine Suche durchführen. Die Idee ist jedoch, dass Sie einmal einen Schlüssel setzen und dann die beobachtete Beschleunigung wiederholt genießen. – Roland
Ein Teil des Problems besteht darin, dass Ihre Schlüsselfelder, so wie Sie es eingerichtet haben, numerisch (Float mit doppelter Genauigkeit) und nicht ganzzahlig sind. Wenn Sie 'num <- 1: 10000' anstelle von 'num <- round (runif (n, 0,1000))' setzen, ist die Indexierung etwa 8 mal schneller. Immer noch ein bisschen langsamer als Vektor-Scannen ohne Schlüssel in diesem Fall. – jlhoward