For loop 如何在Rstudio中处理带有大型对象的for循环?
我有一个大对象的for循环。根据我的尝试和错误,我只能加载一次大型对象。如果我再次加载对象,将返回错误“错误:无法分配大小为***Mb的向量”。我试图通过删除for循环末尾的对象来克服这个问题。但是,在for循环的第二次运行开始时,仍然返回错误“error:cannotallocate vector of size 699.2MB” 我的for循环具有以下结构:For loop 如何在Rstudio中处理带有大型对象的for循环?,for-loop,matrix,vector,memory-management,r-faq,For Loop,Matrix,Vector,Memory Management,R Faq,我有一个大对象的for循环。根据我的尝试和错误,我只能加载一次大型对象。如果我再次加载对象,将返回错误“错误:无法分配大小为***Mb的向量”。我试图通过删除for循环末尾的对象来克服这个问题。但是,在for循环的第二次运行开始时,仍然返回错误“error:cannotallocate vector of size 699.2MB” 我的for循环具有以下结构: for (i in 1:22) { VeryLargeObject <- ...i... ... . .
for (i in 1:22) {
VeryLargeObject <- ...i...
...
.
.
.
...
rm(VeryLargeOjbect)
}
for(1:22中的i){
VeryLargeObject错误“无法分配…”可能是因为rm()不会立即释放内存。因此,加载第二个对象时,第一个对象仍然占用RAM。未分配给任何名称(变量)的对象将在R自行决定的时间点由R收集垃圾
大多数补救措施来自于不将整个对象加载到RAM中:
- 如果您正在使用矩阵,请使用软件包创建一个
filebacked.big.matrix()
。使用var[…,…]
语法将数据写入此对象,就像使用普通矩阵一样。然后,在新的R会话(以及一个新的R脚本以保持再现性)中,您可以从磁盘加载此矩阵并对其进行修改
- 该软件包使用了类似的方法,使用操作系统将RAM页面映射到磁盘的功能。因此,在程序中,这些页面看起来像是在RAM中,但却是从磁盘读取的。为了提高速度,操作系统会将相关部分保留在RAM中
- 如果使用数据帧,则可以使用和之类的包,使您能够仅将数据帧的一部分加载到变量中
- 将数据帧传输到类似sqlite的数据库中,然后使用R访问数据库。包dbplyr使您能够将数据库视为tidyverse样式的数据集。以下是。您还可以使用
另一种方法是不以交互方式编写,而是编写只处理一个对象的R脚本:
编写一个名为的R脚本,比如说processBigObject.R
,它使用commandArgs()
从命令行获取大对象的文件名:
!/usr/bin/env Rscript
#
#处理大对象
#
#用法:Rscript processBigObject.R
input_filename错误“cannot allocate…”可能是因为rm()不会立即释放内存。因此,加载第二个对象时,第一个对象仍然占用RAM。未分配给任何名称(变量)的对象将在R自行决定的时间点由R收集垃圾
大多数补救措施来自于不将整个对象加载到RAM中:
- 如果您正在使用矩阵,请使用软件包创建一个
filebacked.big.matrix()
。使用var[…,…]
语法将数据写入此对象,就像使用普通矩阵一样。然后,在新的R会话(以及一个新的R脚本以保持再现性)中,您可以从磁盘加载此矩阵并对其进行修改
- 该软件包使用了类似的方法,使用操作系统将RAM页面映射到磁盘的功能。因此,在程序中,这些页面看起来像是在RAM中,但却是从磁盘读取的。为了提高速度,操作系统会将相关部分保留在RAM中
- 如果使用数据帧,则可以使用和之类的包,使您能够仅将数据帧的一部分加载到变量中
- 将数据帧传输到类似sqlite的数据库中,然后使用R访问数据库。包dbplyr使您能够将数据库视为tidyverse样式的数据集。以下是。您还可以使用
另一种方法是不以交互方式编写,而是编写只处理一个对象的R脚本:
编写一个名为的R脚本,比如说processBigObject.R
,它使用commandArgs()
从命令行获取大对象的文件名:
!/usr/bin/env Rscript
#
#处理大对象
#
#用法:Rscript processBigObject.R
输入文件名是否检查或指定了环境?是否检查或指定了环境?