在 PostgreSQL 上运行 PL/R 时,R 可以处理比 RAM 更大的数据吗?

Posted

技术标签:

【中文标题】在 PostgreSQL 上运行 PL/R 时,R 可以处理比 RAM 更大的数据吗?【英文标题】:When running PL/R on PostgreSQL, can R handle data bigger then RAM? 【发布时间】:2013-05-17 15:04:35 【问题描述】:

当我使用 R 开源时,如果不使用特定包,则无法处理大于 RAM 内存的数据集。所以我想知道是否可以处理在 PostgreSQL 中应用 PL/R 函数的大数据集。

我没有找到任何关于此的文档。

【问题讨论】:

另外,考虑ff 包,它允许您在磁盘上存储大量数据。 有什么方法可以真正在数据库中运行 R? (非商业,如 Oracle 上的 R) 它确实在 PostgreSQL 内部运行(R 符号链接到 Postgres),但这并没有消除 R RAM 限制。 “符号链接”是什么意思?因为,如果可以以某种方式将函数转换为 SQL,就不会受到任何限制,对吧? 但是,如果在此过程中,将数据传递给 R 对象,则会有内存限制,因为 R 引擎将运行该函数。我知道在 Oracle 实现中没有内存限制,因为 R 解释器“真正在”数据库中运行。 【参考方案1】:

正如 Hong Ooi 所提到的,PL/R 将 R 解释器加载到 PostgreSQL 后端进程中。所以你的 R 代码正在“在数据库中”运行。

没有通用的方法来处理内存限制,但至少有两种可能的选择:

    定义一个自定义 PostgreSQL 聚合,并将您的 PL/R 函数用作 “最终”功能。通过这种方式,您可以分组处理,并且 因此不太可能出现记忆问题。有关详细信息,请参阅在线 PostgreSQL 文档和 PL/R 文档(我不经常发布到 ***,所以很遗憾,它不允许我为您发布实际的 URL) 使用安装的 pg.spi.cursor_open 和 pg.spi.cursor_fetch 函数 PL/R 进入 R 解释器,以便将数据分块分页到 R 函数中。

在此处查看 PL/R 文档:http://www.joeconway.com/plr/doc/index.html

我猜您真正想要的是一个 data.frame,其中数据在底层数据库游标之间以透明方式分页到您的 R 代码。这是我长期的 TODO,但不幸的是我一直没能找到时间来解决它。有人告诉我Oracle 的R 连接器有这个功能,所以似乎可以做到。欢迎使用补丁 ;-)

【讨论】:

非常感谢您的回答!我经常使用 PostgreSQL 和 R,当我了解 PL/R 时,我对解决 R 内存限制的可能性感到兴奋,同时拥有 SQL 的强大功能。【参考方案2】:

没有。 PL/R 只是启动一个单独的 R 进程来运行您的 R 代码。这使用与您在命令行中使用的完全相同的二进制文件和可执行文件,因此所有标准限制仍然适用。

【讨论】:

好的,但是有一些方法可以使用 R 运行真正的“数据库分析”?

以上是关于在 PostgreSQL 上运行 PL/R 时,R 可以处理比 RAM 更大的数据吗?的主要内容,如果未能解决你的问题,请参考以下文章

使用 R 的分级 GAM 结果的均方根偏差

PL/R - 将整列作为参数传递

尝试使用 RODBC 将 R 连接到 PostgreSQL 时出错

在 Windows 机器上运行 Postgresql 11 时导致“更多无法识别...”错误的原因是啥?

在 OSX 上使用 postgresql 测试数据库错误

PostgreSQL 服务无法停止/启动/重启