R - 如何从函数列表中删除元素

时间:2014-09-18 16:04:00

标签: r list parallel-processing

我有一个新问题: 我删除全局列表中的元素,但我使用return()函数。我看到我的其他元素仍然在他的地址(使用inspect),但是操作后的对象没有相同的tracemem。 也许我不理解tracemem,但在我删除后,我移动或复制了什么东西?! 我想将一些操作与列表对象中的大数据并行化,当我完成释放内存时删除变量,所以我想确保我使用相同的对象。

谢谢。

参考信息:How can I remove an element from a list?

# WHEN YOU HAVE BIG DATA, after a process you want to free some memory of your
# object by remove a variable data
# E.G open a *.mat file with structured style -> list
#
# Try with big data and wait a while (your computer) to know
# object_size and mem_used()
#

#------------------------------------------------------------
#With Global Variable
x <- list('a'=123456789,'b'='highlander')
names(x)
paste(length(x),object_size(x),mem_used(),tracemem(x))
.Internal(inspect(x))

# Remove data
x['a'] <- NULL
names(x)
paste(length(x),object_size(x),mem_used(),tracemem(x))
.Internal(inspect(x))
#------------------------------------------------------------
# with function 1 - NOT WORKED
# FREE MEMORY
freeMemoryFromStructuredList1 <- function(x,select){
  paste(length(x),object_size(x),mem_used(),tracemem(x))
  x[select]<- NULL
}

#With Function 1
x <- list('a'=123456789,'b'='highlander')
names(x)
paste(length(x),object_size(x),mem_used(),tracemem(x))
.Internal(inspect(x))

# TRy to Remove data
freeMemoryFromStructuredList1(x,'a')
names(x)
paste(length(x),object_size(x),mem_used(),tracemem(x))
.Internal(inspect(x))

#------------------------------------------------------------
#With Function 2 (return) - WORK, Highlander at the same Address,
# but tracemem NOT

# FREE MEMORY
freeMemoryFromStructuredList2 <- function(x,select){
  paste(length(x),object_size(x),mem_used(),tracemem(x)) 
  x[select]<- NULL
  return( x )
}

x <- list('a'=123456789,'b'='highlander')
names(x)
paste(length(x),object_size(x),mem_used(),tracemem(x))
.Internal(inspect(x))

# Remove data
x <-freeMemoryFromStructuredList2(x,'a')
names(x)
paste(length(x),object_size(x),mem_used(),tracemem(x))
.Internal(inspect(x))

1 个答案:

答案 0 :(得分:1)

这与范围和R函数有关。

R函数按值传递,而不是按引用传递,因此当您调用函数1时,您正在复制列表并从该副本中删除所选元素。副本的范围是函数,因此当函数完成时它将被删除,因为您不会返回它。您的原始列表保持不变。

函数2有效,因为您返回副本,并使用副本重置原始列表,该副本现在已删除元素。 tracemem可能会随函数2而改变,因为现在您的数据结构没有使用相同数量的内存(因为它少了一个元素),因此它占用的位置与原始位置略有不同。这只是一个有根据的猜测。

希望能够解决问题,我不知道你想要如何并行化事物,所以我无法与之对话。