2013-03-27 60 views
3

例如,當減少內存使用:如何傳遞大變量周圍

a(wordwrap(str_repeat('abcdef', 500000), 160, "\n", true));  

function a($v){ 
    $v[1] = 'x';  
    $v = b($v); 
    return $v; 
} 

function b($v){ 
    $v[2] = 'x';  
    $v = c($v); 
    return $v; 
} 

function c($v){ 
    $v[3] = 'x'; 
    d($v);  
} 

function d($v){ 
    $v[4] = 'x'; 
    print $v; 
} 

這使用〜23 MB。我認爲是因爲PHP在每個修改中都創建了該文本的副本。 如果我只在使用12 MB時打印文本。

在函數被調用之前,我可以以某種方式釋放原始變量的內存嗎?像

unset($v); 
$v = c($v); 

顯然,這是行不通的,因爲它被傳遞給c()前笑$v被破壞。但我想以某種方式讓c()修改相同的文本。就像使用引用。 (我試過參考,但他們實際上增加了內存使用量,可能是因爲PHP製作了更多副本)

回答

1

是的,你說得對,PHP使用了寫入時複製的方法。你可能想嘗試引用,例如:

function a(&$v){ 
    $v[1] = 'x';  
    $v = b($v); 
    return $v; 
} 

我剛剛注意到,你試過引用,你確定內存使用率不低?

+0

奇怪的是,它是我上面發佈的代碼,但它對於我正在工作的實際代碼更高:( – Alex 2013-03-27 13:40:53

+0

也許,您錯過了一些重要的部分,它在實際代碼中佔用了內存?是否太大/複雜/共享軟件在這裏發佈? – 2013-03-27 13:44:55