PHP大规模内存使用(30+ GB)使用关联数组

时间:2011-11-02 10:33:28

标签: php arrays memory

我正在构建一个脚本,需要计算每个文件中每个单词的出现次数,大约2000个文件,每个大约500KB。

这是1GB的数据,但是MySQL的使用量超过30GB(然后就会用完和结束)。

我已经找到了我自由使用关联数组的原因,看起来像这样:

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]++;
 }

$ run是当前类别。

你可以看到计算单词的数量我只是将它们添加到关联数组$ words [$ run] [$ word]。随着每个文件类别中每个单词的出现而增加。

然后$ wordused [$ word]用于确保单词不会被添加到单词列表两次。

$ wordlist是一个简单的数组(0,1,2,3等),其中包含所有不同单词的列表。

这会占用大量的内存。有更有效的方法吗?我正在考虑使用MySQL内存表,但我希望用PHP完成整个过程,因此它快速便携。

1 个答案:

答案 0 :(得分:1)

您是否尝试过内置函数来计算单词?
http://hu2.php.net/manual/en/function.str-word-count.php

编辑:或者使用explode获取一系列单词,使用array_walk修剪所有单词,然后sort,然后使用for进行修剪,并计算出现次数,如果一个新单词出现在列表中,你可以flush出现次数,所以不需要先记录 这个单词。