Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
For loop 如何在Rstudio中处理带有大型对象的for循环?_For Loop_Matrix_Vector_Memory Management_R Faq - Fatal编程技术网

For loop 如何在Rstudio中处理带有大型对象的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循环。根据我的尝试和错误,我只能加载一次大型对象。如果我再次加载对象,将返回错误“错误:无法分配大小为***Mb的向量”。我试图通过删除for循环末尾的对象来克服这个问题。但是,在for循环的第二次运行开始时,仍然返回错误“error:cannotallocate vector of size 699.2MB”

我的for循环具有以下结构:

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

输入文件名是否检查或指定了环境?是否检查或指定了环境?