2011-11-02 73 views
0

我正在構建一個腳本,需要對每個文件中每個單詞的出現次數進行計數,大約有2000個文件,每個大約500KB。PHP海量內存使用(30+ GB)使用關聯數組

因此,這是1GB的數據,但MySQL使用超過30+ GB(然後它用完和結束)。

我這種情況的原因找到了我的自由使用的關聯數組,它看起來像這樣:

for($runc=0; $runc<$numwords; $runc++) 
{ 
$word=trim($content[$runc]); 

if ($words[$run][$word]==$wordacceptance && !$wordused[$word]) 
    { 
    $wordlist[$onword]=$word; 
    $onword++; 
    $wordused[$word]=true; 
    } 

$words[$run][$word]++; // +1 to number of occurances of this word in current category 
$nwords[$run]++; 
} 

$運行是當前類別。

您可以看到,要計算單詞的數量,我只是將它們添加到關聯數組$ words [$ run] [$ word]中。隨着每個文件類別中每個單詞的每次出現而增加。

然後$ wordused [$ word]用於確保一個單詞不會被添加兩次到單詞列表。

$ wordlist是一個簡單的數組(0,1,2,3等),其中包含使用的所有不同單詞的列表。

這消耗了巨大的內存量。有沒有更有效的方法來做到這一點?我正在考慮使用MySQL內存表,但我想在PHP中做所有事情,所以它很快速和便攜。

+2

我不明白你顯示的代碼可能會導致MySQL使用大量內存嗎? –

+1

我沒有那麼多關於我的數據,所以我無法測試它:D。但是,PHP的array_count_values方法如何與內存和處理進行堆棧呢? –

+0

結合array_count_values是好的,我會用它來數組合並排序後的單詞。 – Alasdair

回答

1

您是否嘗試過使用內置函數計算單詞?
http://hu2.php.net/manual/en/function.str-word-count.php

編輯:或者使用爆炸將文字的數組,array_walk,然後sort修剪一切,然後用for去,雖然,算上occurances,如果一個新詞來在列表中你可以flush發生的次數,所以不用計算以前的字

+0

不知道那個,但它看起來並不像它可以計算這個詞的出現。只有不同單詞的數量,或者返回不同單詞的列表。但我需要每個單詞的發生次數。 – Alasdair

+0

執行「編輯:」後的方法,我認爲您可以對輸入進行排序,然後進行計數。如果輸入已排序,則不需要_accounting_。 – netmano

+0

嗯...爆炸的話,結合數組(從同一類別的不同文件),然後排序可能只是工作。那麼不需要關聯數組。 – Alasdair