質問

私は言葉が使用された回数に伴い、データベース内のすべての単語4文字以上、格納それらを取るインデクサーを作成するための課題を設定されています。

私は4000個の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;
}

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

...単語がテーブル内に存在する場合、単語のdoesntのが存在は、それを追加した場合、フィールドに単にアペンドessayid(単語の頻度)、その後エッセイテーブルにドキュメントを追加し、する必要があります
// ==============================================================
// === 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");
        }
    }
}
役に立ちましたか?

解決

あなたはあなたのボトルネックがある場所を正確に知ることは、あなたのアプリのプロファイリングを考えるかもしれません。これはあなたに向上することができるもののより良い理解を与えるかもしれない。

DBの最適化について

:チェックあなたはword列に索引を持っている場合、その後、あなたがDBにアクセスする回数を下げてみてください。 INSERT ... ON DUPLICATE KEY UPDATE ...、多分?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top