Я бы хотел оценить время для извлечения данных из растрового временного ряда, используя разные типы файлов (геотиф, бинарный) или объекты (RasterBrick, RasterStack). Я создал функцию, которая извлекает временные ряды из случайной точки растрового объекта, а затем использую микробенчмарк для его проверки.
Пример.
# read a random point from a raster stack
sample_raster <- function(stack) {
poi <- sample(ncell(stack), 1)
raster::extract(stack, poi)
}
# opening the data using different methods
data_stack <- stack(list.files(pattern = '3B.*tif'))
data_brick <- brick('gpm_multiband.tif')
bench <- microbenchmark(
sample_stack = sample_raster(data_stack),
sample_brick = sample_raster(data_brick),
times = 10
)
boxplot(bench)
# this fails because sampled point is different
bench <- microbenchmark(
sample_stack = sample_raster(data_stack),
sample_brick = sample_raster(data_brick),
times = 10,
check = 'equal'
)
Я включил образец мой набор данных здесь
С этим я вижу, что выборка на RasterBrick быстрее, чем стеки (руководство R Raster также говорит так - хорошо). Проблема в том, что я выполняю выборку в разных точках каждого вычисленного выражения. Поэтому я не могу проверить, совпадают ли результаты. Я хотел бы сделать выборку в одном и том же месте (poi) на обоих объектах. Но расположение должно быть разным для каждой итерации. Я попытался использовать опцию setup в microbenchmark, но из того, что я понял, setup оценивается перед синхронизацией каждой функции, а не один раз за итерацию. Таким образом, генерация случайного poi с использованием установки не будет работать.
Можно ли передать тот же аргумент функциям, оцениваемым в микробенчмарке?
Результат
Решение с использованием microbenchmark
Как предложено (и объяснено ниже), я попробовал пакет bench
с вызовом press
. Но по какой-то причине это было медленнее, чем установка одного и того же начального числа на каждой итерации microbenchmark
, как предлагает mnist . Поэтому я вернулся к microbenchmark
. Вот код, который я использую:
library(microbenchmark)
library(raster)
annual_brick <- raster::brick('data/gpm_tif_annual/gpm_2016.tif')
annual_stack <- raster::stack('data/gpm_tif_annual/gpm_2016.tif')
x <- 0
y <- 0
bm <- microbenchmark(
ext = {
x <- x + 1
set.seed(x)
poi = sample(raster_size, 1)
raster::extract(annual_brick, poi)
},
slc = {
y <- y + 1
set.seed(y)
poi = sample(raster_size, 1)
raster::extract(annual_stack, poi)
},
check = 'equal'
)
Решение с использованием bench::press
Для полноты, это было так, как я сделал, используя bench::press
, В процессе я также отделил код для выбора случайной ячейки от функции точечной выборки. Таким образом, я могу определить время только части кода. Вот как я это делаю:
library(bench)
library(raster)
annual_brick <- raster::brick('data/gpm_tif_annual/gpm_2016.tif')
annual_stack <- raster::stack('data/gpm_tif_annual/gpm_2016.tif')
bm <- bench::press(
pois = sample(ncell(annual_brick), 10),
mark(
iterations = 1,
sample_brick = raster::extract(annual_brick, pois),
sample_stack = raster::extract(annual_stack, pois)
)
)