5

したがって、重複行のない単一の data.table に結合したい多くの data.tables があります。これを行う「単純な」方法は、 rbind 呼び出しを一意でラップすることです。unique(do.call(rbind, list.of.tables))

これは確かに機能しますが、かなり遅いです。私の実際のケースでは、テーブルには 2 つの列があります。ハッシュ文字列とサイズ。コードのこの時点では、キーが解除されています。最初にハッシュによるキーイングをいじってみましたが、結合の利点はキーを作成する時間によって相殺されます。

これらのオプションのベンチマーク方法は次のとおりです。

require(data.table)

makeHash <- function(numberOfHashes) {

  hashspace <- c(0:9, sapply(97:122, function(x) rawToChar(as.raw(x))))
  replicate(numberOfHashes, paste(sample(hashspace, 16), collapse=""))

}

mergeNoKey <- function(tableLength, modCount=tableLength/2) {

  A <- B <- data.table(hash=makeHash(tableLength), size=sample(1:(1024^2), tableLength))

  A[1:modCount] <- data.table(hash=makeHash(modCount), size=sample(1:(1024^2), modCount))

  C <- unique(rbind(A,B))
}

mergeWithKey <- function(tableLength, modCount=tableLength/2) {

  A <- B <- data.table(hash=makeHash(tableLength), size=sample(1:(1024^2), tableLength))

  A[1:modCount] <- data.table(hash=makeHash(modCount), size=sample(1:(1024^2), modCount))

  setkey(A, hash)
  setkey(B, hash)

  C <- unique(rbind(A,B))
}

require(microbenchmark)
m <- microbenchmark(mergeNoKey(1000), mergeWithKey(1000), times=10)
plot(m)

tableLength と times をいじってみましたが、パフォーマンスに大きな違いは見られませんでした。これを行うには、もっとdata.tableっぽい方法が必要だと思います。

実際には、2 つではなく多くの data.tables でこれを行う必要があるため、スケーラビリティは非常に重要です。上記のコードをシンプルにしたかっただけです。

前もって感謝します!

4

1 に答える 1

5

私はあなたが使いたいと思うrbindlistunique.data.table...

C <- unique( rbindlist( list( A , B ) ) )
于 2013-09-06T20:06:55.163 に答える