一夜之间编译RMarkdown脚本失败,显示消息:
错误:无法分配缓冲区
执行暂停
它死掉的代码块是在训练一个10个机器学习算法的caretEnsemble列表时。我知道它需要相当多的RAM和计算时间,但我之前成功地在控制台中运行相同的代码。为什么它在RMarkdown中失败了?我很相信即使它用完了可用内存,也有足够的交换。
我正在使用3GB RAM和4GB交换运行Ubuntu。
我在R中发现了一篇关于内存限制的博客文章,但它仅适用于Windows:http://www.r-bloggers.com/memory-limit-management-in-r/
有关解决/避免此问题的任何想法吗?
答案 0 :(得分:2)
它可能备份的一个原因是knitr和Rmarkdown只是为事物添加了一层计算复杂性,它们占用了一些内存。控制台是最简化的实现。
Caret也很胖,很慢而且毫无歉意。如果机器学习算法很复杂,那么数据集很大,而且RAM有限,可能会出现问题。
您可以采取一些措施来减轻负担:
如果集合中有未使用的变量,请使用所需的变量的子集,然后使用rm()
从内存中清除旧集合,并在括号中使用变量名称作为数据框。
删除变量后,运行垃圾收集,它会回收已删除的变量和临时集在内存中占用的内存空间。
R没有本地的内存清除方法,所以如果一个函数没有用垃圾收集器编写而你没有这样做,那么你过去执行的所有垃圾都会在内存中持久存在,从而导致生活变得困难。
要执行此操作,只需在括号中输入gc()
即可。同时在10 ML运行之间用gc()
清除内存。如果你使用XLConnect导入数据,那么java实现是非常低效的...只有这样才能在每次使用它之后点击你的记忆,gc()
。
在设置培训,测试和验证集之后,将测试和验证文件以csv格式保存在硬盘驱动器上并从内存中删除并运行,您猜对了gc().
再次加载它们在第一个模型之后你需要它们。
一旦确定要运行哪些算法,请尝试单独安装原始软件包,而不是运行Caret,require()
每个名称,当你到达它时并清理每个人使用detach(package:packagenamehere)
gc()
后加注。
这有两个原因。
一个,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时,我收到此错误。