当前位置:  开发笔记 > 运维 > 正文

避免传递数据框的最佳方法是什么?

如何解决《避免传递数据框的最佳方法是什么?》经验,为你挑选了2个好方法。

我有12 data.frame秒钟可以使用.它们是相似的,我必须对每个进行相同的处理,所以我写了一个函数,它接受一个data.frame,处理它,然后返回一个data.frame.这有效.但我担心我会绕过一个非常大的结构.我可能正在制作临时副本(是吗?)这样做效率不高.避免data.frame四处走动的最佳方法是什么?

doSomething <- function(df) {
  // do something with the data frame, df
  return(df)
}

JD Long.. 10

实际上,您正在传递对象并使用一些内存.但我不认为你可以对R中的对象进行操作而不传递对象.即使您没有创建函数并在函数之外执行操作,R的行为也基本相同.

看到这个的最好方法是建立一个例子.如果您在Windows中打开Windows任务管理器.如果您在Linux中打开终端窗口并运行top命令.我将在这个例子中假设Windows.在R中运行以下内容:

col1<-rnorm(1000000,0,1)
col2<-rnorm(1000000,1,2)
myframe<-data.frame(col1,col2)

rm(col1)
rm(col2)
gc()

这会创建一些名为col1和col2的向量,然后将它们组合成一个名为myframe的数据框.然后它删除向量并强制运行垃圾收集.在Windows任务管理器中查看Rgui.exe任务的mem用法.当我开始R时,它使用大约19兆的内存.在我运行上述命令后,我的机器使用不到35兆瓦的R.

现在试试这个:

myframe<-myframe+1

你的R内存使用量应该超过144兆.如果你使用gc()强制垃圾收集,你会看到它回落到大约35兆.要使用函数尝试此操作,您可以执行以下操作:

doSomething <- function(df) {
    df<-df+1-1
return(df)
}
myframe<-doSomething(myframe)

当您运行上面的代码时,内存使用量将跳升至160兆左右.运行gc()会将其降回35 meg.

那么这一切又如何呢?好吧,在函数之外进行操作并不比在函数中执行操作更有效(就内存而言).垃圾收集清理真的很好.你应该强制gc()运行吗?可能不是因为它会根据需要自动运行,我只是在上面运行它以显示它如何影响内存使用情况.

我希望有所帮助!



1> JD Long..:

实际上,您正在传递对象并使用一些内存.但我不认为你可以对R中的对象进行操作而不传递对象.即使您没有创建函数并在函数之外执行操作,R的行为也基本相同.

看到这个的最好方法是建立一个例子.如果您在Windows中打开Windows任务管理器.如果您在Linux中打开终端窗口并运行top命令.我将在这个例子中假设Windows.在R中运行以下内容:

col1<-rnorm(1000000,0,1)
col2<-rnorm(1000000,1,2)
myframe<-data.frame(col1,col2)

rm(col1)
rm(col2)
gc()

这会创建一些名为col1和col2的向量,然后将它们组合成一个名为myframe的数据框.然后它删除向量并强制运行垃圾收集.在Windows任务管理器中查看Rgui.exe任务的mem用法.当我开始R时,它使用大约19兆的内存.在我运行上述命令后,我的机器使用不到35兆瓦的R.

现在试试这个:

myframe<-myframe+1

你的R内存使用量应该超过144兆.如果你使用gc()强制垃圾收集,你会看到它回落到大约35兆.要使用函数尝试此操作,您可以执行以下操作:

doSomething <- function(df) {
    df<-df+1-1
return(df)
}
myframe<-doSomething(myframe)

当您运行上面的代码时,内存使用量将跳升至160兆左右.运行gc()会将其降回35 meg.

那么这一切又如何呢?好吧,在函数之外进行操作并不比在函数中执行操作更有效(就内存而言).垃圾收集清理真的很好.你应该强制gc()运行吗?可能不是因为它会根据需要自动运行,我只是在上面运行它以显示它如何影响内存使用情况.

我希望有所帮助!



2> 小智..:

我不是R专家,但大多数语言都使用引用计数方案来处理大对象.在修改对象的副本之前,不会创建对象数据的副本.如果您的函数只读取数据(即用于分析),则不应复制.


这也是R的作用,Neil.好点子.
推荐阅读
LEEstarmmmmm
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有