【问题标题】:What happens to memory allocated by C functions in R languageR语言中C函数分配的内存会发生什么
【发布时间】:2012-11-25 13:35:47
【问题描述】:

在我的 R 包中,实现该函数的 C 代码分配了一些内存供使用。 这段记忆会发生什么? 它会在 R 的 GC 的雷达下还是内存泄漏? 如果它在 R 的垃圾回收下,这块内存会被回收吗?

我在作为服务器运行的 R 的服务器进程中分配了 5 GB 的巨大数据。 在这里,如果我可以像我们在 Java 中分配外部堆内存一样,从 GC 的雷达中分配这些内存,那将是一个好主意。 所以基本上,我可以在我的 C 代码中分配大量内存而 R 不会干扰该内存吗?

我打算使用 malloc 或 calloc 来分配内存。

【问题讨论】:

  • 答案将取决于您如何分配内存,这在您的问题中没有说明。
  • 我将使用 C 中的 malloc 或 calloc 等常规方法来分配内存。
  • 不,R 不会神奇地知道您使用任意 C 函数分配了哪些内存。 R 确实知道您使用 R 的 C 函数分配了哪些内存。

标签: r memory-management garbage-collection package


【解决方案1】:

这在“编写 R 扩展”中有相当清楚的描述——使用calloc() / malloc() 的 R 变体访问相同的内存池。这样 R 可以gc() 这些东西,以及为什么你需要PROTECT()UNPROTECT()

6.1.2 用户控制的内存

内存分配的另一种形式是malloc的接口,即 提供 R 错误处理的接口。此内存持续到被释放 由用户提供,并且是为 R 分配的内存的附加内容 工作区。

接口函数是

 TYPE* Calloc(size_t N, TYPE)
 TYPE* Realloc(ANY *P, size_t N, TYPE)
 void Free(ANY *P)

提供callocreallocfree 的类似物。如果有一个 分配期间的错误由 R 处理,所以如果这些例程 返回内存已成功分配或释放。 Free 将指针 P 设置为NULL。 (一些但不是所有版本的 S 所以。)

用户不再需要时应安排Free此内存, 包括错误或用户中断。这通常可以做到 方便地从调用 R 函数中的 on.exit 操作 - 请参阅 以pwilcox 为例。

不要假设Calloc/Realloc分配的内存来了 来自malloc 使用的同一个池:尤其不要使用 freestrdup

如果这些入口点需要以R_为前缀 STRICT_R_HEADERS 已定义。

【讨论】:

  • malloc(而不是CallocRealloc)分配的内存是否也由垃圾回收处理?我的假设是否定的,因此特定于 R 的版本是正确的,但我显然在这里有点摸不着头脑。
  • @AriB.Friedman:这些方法都没有被垃圾收集器处理;它们都是用户控制的,因此必须手动释放。
  • @dirk - 我希望我们不必在 Calloc/Ralloc 拥塞时使用 PROTECT/UNPROTECT !!!
  • @AriB.Friedman 不是,因此需要切换到Calloc()。它。全部。在。这。手动。
  • @VineethMohan:一旦你完成它,一切都会变得有意义,我们在这里向你重复手册是没有意义的。我们作为用户分配和“交回”给 R 的东西可能(最终)被 R 释放,这就是为什么,是的 Veronica,我们需要 Calloc() 或 PROTECT。或者只是切换到 C++ 并使用我们的 Rcpp 包,这一切 (!!) 自动发生 (!!)。
【解决方案2】:

来自钱伯斯的数据分析软件

只要任何计算都可能动态分配 R 存储 并且结果不是在 R 级别分配的,使用 相应的 C 参考必须受到保护和保护 取消保护宏。原因是否则存储将 R中发布的碰巧做了动态存储的垃圾回收 在计算过程中。

【讨论】:

  • 我在 C 代码中看到了 PROTECT 和 UNPROTECT 函数,我觉得它与 R 的内存管理有关。
  • 阿里,那是错误的。您(即程序员)执行 malloc'ing,但您使用 R 提供的函数访问其内存池/分配。
  • @DirkEddelbuettel 你当然是对的。我刚刚找到了 SDA 的相关部分并回来更新我的答案。应该在一秒钟内完成。
猜你喜欢
  • 2014-04-15
  • 2018-01-03
  • 1970-01-01
  • 2021-11-12
  • 1970-01-01
  • 2014-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多