r - 在 R 中加速 rasterFromXYZ
问题描述
我想从具有超过 1 亿个单元格的 data.table 创建一个栅格。目前,我将其转换data.table
为 a data.frame
,然后使用包中的rasterFromXYZ
函数raster
。不幸的是,光栅包非常慢,创建光栅需要 4-5 小时。
是否有任何软件包或已经实施的解决方案来加速这个过程?如果不是(这就是我的假设),我认为最快的解决方案应该是划分大 data.table 以创建许多小栅格,然后在最后合并它们?
解决方案
数据表是否按行和列排序,您是否已经知道网格的几何形状?如果是这样,那么您可能可以通过创建正确大小和形状的矩阵来加快速度,然后从该矩阵创建一个栅格并将几何分配给它。
小例子:
> 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)
现在,该函数必须做的一些事情是通过 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 个单元格栅格上做什么,都需要一段时间,因此请使用与您的真实数据类似的格式对较小的示例进行测试,看看它是否成功。
推荐阅读
- python - Pyspark:可以切片列表,但不能索引
- mysql - 表上的慢速连接(10k 行)
- function - Powershell:为什么这个功能不起作用?
- javascript - 如何使用真实的信用卡来测试 Web 应用程序
- lfsr - Berlekamp-Massey 最小 LFSR 问题
- c# - 使用 Microsoft Visual Studio 安装程序项目构建 MSI 时如何扩展 user.config 设置
- python-2.7 - 通过 Nio.open_file 从 grib2 文件推断的变量名称 - 或带有引擎 pynio 的 xr.open_dataset
- python - 熊猫仅在具有至少 1 个非 NaN 值的行上填充
- c++ - 如何通过 UDP 传输我的数据 (XML)?
- go - 字符串的简单加密