【问题标题】:R: importing data.table package namespace, unexplainable jump in memory consumptionR:导入data.table包命名空间,内存消耗莫名其妙的跳跃
【发布时间】:2012-05-17 00:10:56
【问题描述】:

我在自己的包中使用 data.table 包,并在 NAMESPACE 和 DESCRIPTION 文件中导入 data.table 命名空间。 在我的一个函数中,我使用 data.table 函数将 data.frame 转换为 data.table

dt <- data.table(df)

但是当我调用我的函数时,在调用 data.table() 时,内存使用量会立即跳跃,而 R 会停止响应。 当我逐行运行并且内存消耗低时,函数中的代码运行良好。 另外,如果我将 library(data.table) 放在我的函数中,一切都很好。我试图避免将 library(data.table) 放在我的函数中,而是声明依赖关系。但是,这种方式似乎出了点问题。我在 Mac OS X 10.6.8 上运行 R-2.14.0

谁能解释可能是什么原因,我该如何解决(不在我的函数中使用 library(data.table))?

【问题讨论】:

  • 如何在命名空间和描述文件中进行导入?
  • 如果没有可重现的示例,就很难诊断问题。你能提供你的包的来源吗?

标签: r memory namespaces data.table


【解决方案1】:

一些没有特定顺序的随机猜测:

尝试仅在说明中使用 Imports 或 Depends 字段。我认为您也不需要在 NAMESPACE 中导入,但我可能错了。为什么这可以解释内存使用,但不知道。

df 是什么?它是大的还是以某种方式递归或奇怪的?如果可能,请提供str(df) 告诉我们一些相关信息。

试试as.data.table(df),它比data.table(df) 快。但是听起来您的问题与此不同。

您的函数调用是否被重复调用?我明白为什么反复将df 转换为dt 会耗尽内存,但不明白为什么只调用library(data.table) 会那么快。

尝试使用R --vanilla 启动R,以确保在启动时不加载.Rdata(其中可能包括屏蔽data.table 的函数)等。如果您已经开发了自己的包,那么某种函数名称冲突,或者search() 路径上的包顺序听起来很合理。

否则,我们将需要更多信息。我不记得有任何类似的事情发生在我身上,或者之前被报道过。

还有,您使用的是哪个版本的data.table?在 R-Forge 上的 v1.8.1 中有这个错误修复(还没有在 CRAN 上):

  • data.table 设置代码从.onAttach 移至.onLoad,以便当data.table 只是从包中的imported 时也运行它,修复与缺少data.table 选项相关的#1916。

但是,如果您使用的是 CRAN 的 1.8.0,并且正在导入(仅)而不是依赖,那么我希望您会收到有关缺少选项的错误,而不是内存消耗的跳跃。

【讨论】:

  • 我正在使用 data.table v1.8.0。因此,如果我只导入,我应该会收到一条错误消息,但我没有。在这种情况下,似乎在搜索路径中找到了其他一些 data.table 函数,并且该函数会导致大量内存消耗。我尝试将 data.table 放在 Depends 下,一切正常。 df 是一个具有 ~500000 行和 4 列的 data.frame,当我在 Depends 内存消耗下使用 data.table 运行代码时约为 2 GB。但是,当 data.table 在 Imports 下时,相同代码的内存消耗约为 40 GB(我尝试在服务器上而不是在我的 Mac 上运行它)
  • 可以升级到 1.8.1 吗?至少只是看看该错误修复是否修复了它。你说在搜索路径中找到了另一个data.table函数,可以find吗?
  • 升级到 1.8.1 修复了所有问题。现在它可以正常用于 Importing 和Depending。我不知道旧版本在导入时有什么问题。尽管我在搜索路径中找不到 data.table 函数,但似乎以某种方式创建了 data.table ?!: cat(class(df)) > data.frame find("data.table") > character(0) dt data.table data.frame 所以 data.table 已经创建,但是当尝试在创建的 dt 上使用“[”函数时,一个出现有关缺少选项的错误。
  • 如果我通过以下方式提供缺少的选项: options(datatable.nomatch=0) options(datatable.verbose=F) 代码一直运行,可以完成工作,但内存消耗要高 20 倍比平时多。
  • 太棒了。我假设您在最后的评论中谈论的是 1.8.0 而不是 1.8.1。感谢您提供额外信息。我现在可以重现这个并提交了bug#2014 解释发生了什么。如果您只需要保留 1.8.0 和 Import,那么也设置 options(datatable.alloccol=100L) 并且内存消耗问题应该会消失。或者,改为 Depend 或升级到 1.8.1。在您的导入字段中,您可以指定 data.table 版本 1.8.1 或更高版本。谢谢!
猜你喜欢
  • 2014-06-30
  • 1970-01-01
  • 1970-01-01
  • 2012-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-23
相关资源
最近更新 更多