如何在PHP中处理相对较大的数组?

时间:2014-07-08 10:09:06

标签: php arrays

我有超过5000的大量文本文件,有超过200,000个单词。问题是,当我尝试将整个集合组合成一个数组以便在集合中找到唯一的单词时,没有显示输出(这是由于数组的大小非常大)。以下代码适用于小编号。收集,例如,30个文件,但不能在非常大的集合上操作。帮我解决这个问题。感谢

<?php
ini_set('memory_limit', '1024M');
$directory = "archive/";
$dir = opendir($directory);
$file_array = array(); 
while (($file = readdir($dir)) !== false) {
  $filename = $directory . $file;
  $type = filetype($filename);
  if ($type == 'file') {
    $contents = file_get_contents($filename);
    $text = preg_replace('/\s+/', ' ',  $contents);
    $text = preg_replace('/[^A-Za-z0-9\-\n ]/', '', $text);
    $text = explode(" ", $text);
    $text = array_map('strtolower', $text);
    $stopwords = array("a", "an", "and", "are", "as", "at", "be", "by", "for", "is", "to");
    $text = (array_diff($text,$stopwords));
    $file_array = array_merge($file_array,  $text);
  }
}
closedir($dir); 
$total_word_count = count($file_array);
$unique_array = array_unique($file_array);
$unique_word_count = count($unique_array);
echo "Total Words: " . $total_word_count."<br>";
echo "Unique Words: " . $unique_word_count;
?> 

可在此处找到文本文件的数据集:https://archive.ics.uci.edu/ml/machine-learning-databases/00217/C50.zip

4 个答案:

答案 0 :(得分:1)

不要使用多个数组,只需构建一个数组,然后只填充单词并在插入时计算它们。这样会更快,你甚至可以计算每个单词的数量。

顺便说一句,您还需要将空字符串添加到停用词列表中,或者调整逻辑以避免将其删除。

<?php
$directory = "archive/";
$dir = opendir($directory);
$wordcounter = array();
while (($file = readdir($dir)) !== false) {
  if (filetype($directory . $file) == 'file') {
    $contents = file_get_contents($directory . $file);
    $text = preg_replace('/\s+/', ' ',  $contents);
    $text = preg_replace('/[^A-Za-z0-9\-\n ]/', '', $text);
    $text = explode(" ", $text);
    $text = array_map('strtolower', $text);
    foreach ($text as $word)
        if (!isset($wordcounter[$word]))
            $wordcounter[$word] = 1;
        else
            $wordcounter[$word]++;
  }
}
closedir($dir); 

$stopwords = array("", "a", "an", "and", "are", "as", "at", "be", "by", "for", "is", "to");
foreach($stopwords as $stopword)
    unset($wordcounter[$stopword]);

$total_word_count = array_sum($wordcounter);
$unique_word_count = count($wordcounter);
echo "Total Words: " . $total_word_count."<br>";
echo "Unique Words: " . $unique_word_count."<br>";

// bonus:
$max = max($wordcounter);
echo "Most used word is used $max times: " . implode(", ", array_keys($wordcounter, $max))."<br>";
?>

答案 1 :(得分:0)

为什么要将所有数组合并为一个无用的大数组?

您可以使用array_unique函数从数组中获取唯一值,而不是将其与文件中的下一个数组连接,并再次应用相同的函数。

答案 2 :(得分:0)

不要将内存限制增加到高。这通常不是最佳解决方案。

你应该如何逐行加载文件(在将格式作为CSV处理时在PHP中很容易),计算单行(或一小串一行)并写入输出文件。这样,您可以使用少量内存来处理大量输入数据。

在任何情况下都试图找到一种方法将整个输入分成更小的块,即使不增加内存限制也可以处理。

答案 3 :(得分:0)

另一种方法是将所有内容加载到db表中,然后让数据库服务器处理最多。

或者处理行中的行并标记已完成的行或将它们聚合到另一个表中。