R代码失败:“错误:无法分配缓冲区”

时间:2016-04-30 18:09:00

标签: r

一夜之间编译RMarkdown脚本失败,显示消息:

  

错误:无法分配缓冲区
  执行暂停

它死掉的代码块是在训练一个10个机器学习算法的caretEnsemble列表时。我知道它需要相当多的RAM和计算时间,但我之前成功地在控制台中运行相同的代码。为什么它在RMarkdown中失败了?我很相信即使它用完了可用内存,也有足够的交换。

我正在使用3GB RAM和4GB交换运行Ubuntu。

我在R中发现了一篇关于内存限制的博客文章,但它仅适用于Windows:http://www.r-bloggers.com/memory-limit-management-in-r/

有关解决/避免此问题的任何想法吗?

2 个答案:

答案 0 :(得分:2)

它可能备份的一个原因是knitr和Rmarkdown只是为事物添加了一层计算复杂性,它们占用了一些内存。控制台是最简化的实现。

Caret也很胖,很慢而且毫无歉意。如果机器学习算法很复杂,那么数据集很大,而且RAM有限,可能会出现问题。

您可以采取一些措施来减轻负担:

  1. 如果集合中有未使用的变量,请使用所需的变量的子集,然后使用rm()从内存中清除旧集合,并在括号中使用变量名称作为数据框。

  2. 删除变量后,运行垃圾收集,它会回收已删除的变量和临时集在内存中占用的内存空间。

  3. R没有本地的内存清除方法,所以如果一个函数没有用垃圾收集器编写而你没有这样做,那么你过去执行的所有垃圾都会在内存中持久存在,从而导致生活变得困难。

    要执行此操作,只需在括号中输入gc()即可。同时在10 ML运行之间用gc()清除内存。如果你使用XLConnect导入数据,那么java实现是非常低效的...只有这样才能在每次使用它之后点击你的记忆,gc()

    1. 在设置培训,测试和验证集之后,将测试和验证文件以csv格式保存在硬盘驱动器上并从内存中删除并运行,您猜对了gc().再次加载它们在第一个模型之后你需要它们。

    2. 一旦确定要运行哪些算法,请尝试单独安装原始软件包,而不是运行Caret,require()每个名称​​,当你到达它时并清理每个人使用detach(package:packagenamehere) gc()后加注。

    3. 这有两个原因。

      一个,Caret是其他ML算法的集合,在本地环境中它本身比所有ML算法慢。一个例子:我在30分钟后通过Caret中的随机森林运行数据集我完成了不到20%。它已经在大约一小时的标记处坠毁了两次。我加载了原始的独立包装,并在大约4分钟内完成了分析。

      两个,如果你需要,分离和垃圾收集,你的居民记忆力就会减少,而不用担心会让你失望。否则你会立刻在内存中拥有所有的插入功能......这很浪费。

      您可以采取一些一般性措施,使其变得更好,您可能最初没有想到但可能有用。根据您的代码,它们可能会或可能不会在不同程度上起作用或工作,但请尝试它们并查看它的来源。

      予。使用词法范围对您有利。在干净的Rstudio环境中运行整个脚本,并确保所有部件和部件都存放在您的工作区中。然后垃圾收集残余物。然后去knitr& rMarkdown并从现有工作空间调用零件和零件。它可以在同一个rStudio shell下的Markdown中使用,只要在循环中没有创建任何内容并且不将其保存到全局环境中。

      II。在markdown中设置你的代码块,这样你就可以缓存需要多次计算的东西,这样它就可以在某处准备好被调用,而不是多次对内存征税。

      如果你从一个数据框中调用一个变量,做一些简单的操作,就像将它与一列中的每个观察值相乘并将其保存回原来的同一帧,你最终可能会在内存中找到多达3个副本。如果文件很大,那就是杀手锏。因此,制作一个干净的副本,垃圾收集和缓存纯帧。

      直观地缓存似乎会浪费内存,并且会做错了,但是如果你定期从环境和gc()中获取不必要的东西,你可能会受益于战术缓存

      III。如果事情仍然陷入困境,你可以尝试将结果保存在csv文件中,将它们发送到硬盘驱动器并根据需要重新调用它们,以便在一次不需要所有数据的情况下将它们移出内存。 / p>

      我非常确定您可以根据需要设置程序以加载和卸载库,数据和结果。但老实说,基于我自己的偏见经验,你可以做的最好的事情是从大型多算法流程中脱离Caret。

答案 1 :(得分:0)

当我无意中在我的64位计算机上运行32位版本的R时,我收到此错误。