将 spatstat 函数转换为 C++ 以规避内存限制

Convert spatstat functions to C++ to circumvent memory-limitation

我正在使用 spatstat 来估计害虫从道路、高速公路和其他道路传入和传播的风险。但是,我相信我 运行 陷入了内存限制问题;我的数据是大陆规模的,我的电脑只有 16 GB 的内存。 运行 spatstat 的 as.owin()density.psp() 函数时我收到的警告消息是:

Error: cannot allocate vector of size X.X. Gb

我的一些同事建议我可以通过将 spatstat 函数 as.owin()density.psp() 转换为使用 rcpp 包通过 C++ 执行来减轻内存负担。这项技术完全超出了我的舒适范围,我希望在投入大量时间之前从 Whosebug 了解它是否可行。

具体来说,我的问题是:

  1. 有人将 spatstat 函数转换为 C++ 吗?
  2. 其他 spatstat 用户如何解决内存限制问题?

如有任何帮助和指导,我们将不胜感激。

非常感谢,

乔什

首先我非常同意发帖者所说的快速修复不是编辑代码而是在现有代码上投入更多计算资源。使用云计算服务可能很繁琐,但 re-implement、测试和验证全新的源代码将花费更多时间。

但无论如何:

首先要检查的是您要创建的像素图像是否太大而根本无法存储在 R 内存中。尝试只创建 Z <- as.im(R, dimyx=d),其中 R 是一个包含空间域的矩形,d 是所需图像的尺寸(行、列)。如果失败并显示有关内存限制的消息,那么您将需要更大的船 -- 我的意思是,计算机。

函数density.psp有选项method="FFT"(默认)和 method="C"。你试过这两种吗? FFT 方法使用更多内存,因为它在一个巨大的傅里叶变换中完成整个计算(在将域扩展到其原始大小的几倍之后)。 C 方法是对所有像素和所有段进行循环;它速度较慢,但​​需要相对较少的内存,除了输出栅格数据的存储。如果 method="C" 由于内存不足而失败,这将再次表明您尝试创建的光栅图像太大而无法存储在 R 内存中。

函数as.owin是通用的,有28个方法。哪种方法给您带来麻烦?您要将哪些数据转换为 owin

spatstat 已经写成 RCC++ 的混合形式。我们一直在寻找加速代码和减少内存需求的方法。如果您发现代码运行缓慢的特定情况,我们希望了解详细信息。如果您确实发现了修复或加速某些代码的方法,请分享它。