Улучшение производительности подмножеств data.table - PullRequest
0 голосов
/ 28 мая 2019

Я запускаю большую симуляцию Монте-Карло и обнаружил, что настройка / поиск моих данных - самая медленная часть моего кода. Чтобы протестировать некоторые альтернативы, я провел тестирование производительности с помощью фреймов данных, таблицы данных и матрицы. Вот эталонный код:

library(data.table)
#install.packages('profvis')
library(profvis)
x.df = data.frame(a=sample(1:10,10000,replace=T), b=sample(1:10,10000,replace=T)) # set up a dataframe
x.dt = as.data.table(x.df) # a data.table
setkey(x.dt,a) # set key for faster searches
x.mat = as.matrix(x.df) # a matrix

profvis({
for (i in 1:10000) {
  # test simple subsetting
  xsubset.mat = x.mat[100:200,2]
  xsubset.df = x.df[100:200,2]
  xsubset.dt = x.dt[100:200,2]
  # test search preformance
  xsearch.mat = x.mat[which(x.df$a==10),2]
  xsearch.df = x.df[which(x.df$a==10),2]
  xsearch.dt = x.dt[.(10),2]
}
})

Вот мои результаты: benchmark scores Если серьезно, мне нравится компактный синтаксис data.table, и мне интересно, могу ли я что-то сделать, чтобы улучшить его производительность. По словам создателей, он должен быть очень быстрым. Я использую это неправильно?

1 Ответ

1 голос
/ 29 мая 2019

После еще нескольких сравнительных тестов я теперь понимаю проблему.Самый быстрый пакет зависит от того, много ли я выполняю поиск или один большой поиск.Похоже, что data.table имеет много накладных расходов на поиск, что делает его более подходящим для работы с одной большой таблицей, а не с большим количеством запросов для маленьких.

Рассмотрим следующий код и сравните с оригиналом:

# make a giant table, but search it only once:
x.df = data.frame(a=sample(1:10,100000000,replace=T), b=sample(1:10,100000000,replace=T))
x.dt = as.data.table(x.df)
setkey(x.dt,a)
x.mat = as.matrix(x.df)

profvis({
for (i in 1:1) {
  xsubset.mat = x.mat[100:200,2]
  xsubset.df = x.df[100:200,2]
  xsubset.dt = x.dt[100:200,2]

  xsearch.mat = x.mat[which(x.df$a==10),2]
  xsearch.df = x.df[which(x.df$a==10),2]
  xsearch.dt = x.dt[.(10),2]
}
})

Результаты: searching one big table

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...