Ускорьте растрFXXZ в R - PullRequest
       10

Ускорьте растрFXXZ в R

0 голосов
/ 06 января 2020

Я хочу создать растр из таблицы данных с более чем 100 миллионами ячеек. В настоящее время я конвертирую data.table в data.frame, а затем использую функцию rasterFromXYZ из растрового пакета. К сожалению, растровый пакет работает довольно медленно, и создание растра занимает 4-5 часов.

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

1 Ответ

0 голосов
/ 06 января 2020

Упорядочена ли таблица данных по строкам и столбцам, и вы уже знаете геометрию вашей сетки? Если это так, то вы, вероятно, можете ускорить процесс, создав матрицу правильного размера и формы, а затем создав растр из этой матрицы и присвоив ей геометрию.

Крошечный пример:

> d = data.frame(expand.grid(1:3,1:4),1:12)
> d
   Var1 Var2 X1.12
1     1    1     1
2     2    1     2
3     3    1     3
4     1    2     4
5     2    2     5
6     3    2     6
7     1    3     7
8     2    3     8
9     3    3     9
10    1    4    10
11    2    4    11
12    3    4    12

Использование rasterFromXYZ дает мне следующее:

> r1 = rasterFromXYZ(d)
> r1
class      : RasterLayer 
dimensions : 4, 3, 12  (nrow, ncol, ncell)
resolution : 1, 1  (x, y)
extent     : 0.5, 3.5, 0.5, 4.5  (xmin, xmax, ymin, ymax)
crs        : NA 
source     : memory
names      : X1.12 
values     : 1, 12  (min, max)

Теперь некоторые функции этой функции - это go через координаты X и Y для определения геометрии сетки. Но если вы уже знаете экстент и размер, то вы также можете создать один и тот же растр за несколько шагов.

Сначала сделайте матрицу правильной стороной - для моего заказа в d Мне нужно заполнить матрицу по строкам и переверните строки, чтобы получить правильный порядок. Если ваша таблица XYZ упорядочена по-другому, то вам может потребоваться выполнить некоторые другие манипуляции, или это может быть правильным. Обратите внимание, здесь я должен знать заранее, сколько там строк и столбцов:

r2 = raster(matrix(d[,3],ncol=3,nrow=4,byrow=TRUE)[4:1,])

, затем установить экстент. Здесь я должен заранее знать экстенты, в данном случае на половину ячейки шире, чем минимальное и максимальное значения, а размер моей ячейки составляет одну единицу:

extent(r2) = c(xmin=0.5, xmax=3.5, ymin=0.5, ymax=4.5)

Все, что вы делаете, займет некоторое время на 100 000 000 растровых ячеек, так что тестируйте на небольших примерах форматы, аналогичные вашим реальным данным, чтобы увидеть, является ли это победой.

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