2014-09-18 56 views
0

我有一個新問題: 我刪除全局列表中的元素,但我通過使用return()函數。我看到我的其他元素仍然在他的地址(使用檢查),但操作後的對象不具有相同的tracemem。 也許我不明白tracemem,但刪除後,我是否移動或複製了一些東西?! 我想用列表對象中的大數據並行化一些操作,當我完成釋放內存時刪除變量,所以我想確保我使用同一個對象。R - 如何從函數的列表中刪除元素

謝謝。

參考信息: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

這與確定範圍和R函數來執行。

R函數按值傳遞,而不是通過引用傳遞,因此當您調用函數1時,您正在製作列表的副本並從該副本中刪除選定的元素。複製的範圍就是函數,所以當函數完成時它會被刪除,因爲你沒有返回它。您的原始列表保持不變。

功能2的工作原理是因爲您返回副本,並使用現在已刪除元素的副本重置您的原始列表。 tracemem可能隨着函數2而改變,因爲現在你的數據結構沒有使用相同數量的內存(因爲它少了一個元素),因此它佔據的位置與原始位置稍有不同。這只是一個受過教育的猜測。

希望能夠解決問題,我不知道你想如何平行化,所以我不能說這些。

+0

這就是我對結果所設想的結果,但我希望有一種方法可以像C中那樣通過引用。 我不再尋求進一步的了。 謝謝DMT – swatz 2014-09-18 17:48:11

+0

沒問題,很高興我可以幫忙 – DMT 2014-09-18 17:56:10