2009-09-03 18 views
0

すべての単語を4文字以上使用し、単語が何回使用されたかとともにデータベースに格納するインデクサーを作成する課題が設定されました。PHPでのテキストファイルの索引付け

このインデクサーを4,000のtxtファイルで実行する必要があります。現在、約12〜15分かかります。スピードアップの提案があれば疑問です。次のように

は現在、私は、配列内の単語を配置することだ:

// ============================================================== 
// === Create an index of all the words in the document 
// ============================================================== 
function index(){ 
    $this->index = Array(); 
    $this->index_frequency = Array(); 

    $this->original_file = str_replace("\r", " ", $this->original_file); 
    $this->index = explode(" ", $this->original_file); 

    // Build new frequency array 
    foreach($this->index as $key=>$value){ 
     // remove everything except letters 
     $value = clean_string($value); 

     if($value == '' || strlen($value) < MIN_CHARS){ 
      continue; 
     } 

     if(array_key_exists($value, $this->index_frequency)){ 
      $this->index_frequency[$value] = $this->index_frequency[$value] + 1; 
     } else{ 
      $this->index_frequency[$value] = 1; 
     } 
    } 
    return $this->index_frequency; 
} 

私は、現時点で最大のボトルネックは、データベース内の単語を格納するためのスクリプトだと思います。それは

// ============================================================== 
// === Store the word frequencies in the db 
// ============================================================== 
private function store(){ 
    $index = $this->index(); 

    mysql_query("INSERT INTO essays (checksum, title, total_words) VALUES ('{$this->checksum}', '{$this->original_filename}', '{$this->get_total_words()}')") or die(mysql_error()); 

    $essay_id = mysql_insert_id(); 

    foreach($this->index_frequency as $key=>$value){ 

     $check_word = mysql_result(mysql_query("SELECT COUNT(word) FROM `index` WHERE word = '$key' LIMIT 1"), 0); 

     $eid_frequency = $essay_id . "(" . $value . ")"; 

     if($check_word == 0){ 
      $save = mysql_query("INSERT INTO `index` (word, essays) VALUES ('$key', '$eid_frequency')"); 
     } else { 
      $eid_frequency = "," . $eid_frequency; 
      $save = mysql_query("UPDATE `index` SET essays = CONCAT(essays, '$eid_frequency') WHERE word = '$key' LIMIT 1"); 
     } 
    } 
} 

答えて

1
...エッセイテーブルにドキュメントを追加し、単語がテーブルに存在する場合には単語が存在doesntのならば、ただ、フィールドにessayid(単語の頻度)を追加し、それを追加する必要があります

アプリケーションをプロファイリングして、どこにボトルネックがあるのか​​を正確に知ることができます。これにより、改善できる点をより深く理解することができます。

DB最適化について:word列にインデックスがあるかどうかを確認し、DBにアクセスする回数を減らしてみてください。 INSERT ... ON DUPLICATE KEY UPDATE ...、多分?

+0

ありがとうn1313!私はDBに照会した時間を減らすように取り組んだ。ご協力いただきありがとうございます。 – Matt

関連する問題