我有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()运行吗?可能不是因为它会根据需要自动运行,我只是在上面运行它以显示它如何影响内存使用情况.
我希望有所帮助!
实际上,您正在传递对象并使用一些内存.但我不认为你可以对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()运行吗?可能不是因为它会根据需要自动运行,我只是在上面运行它以显示它如何影响内存使用情况.
我希望有所帮助!
我不是R专家,但大多数语言都使用引用计数方案来处理大对象.在修改对象的副本之前,不会创建对象数据的副本.如果您的函数只读取数据(即用于分析),则不应复制.