Question

J'ai lancé un défi pour créer un indexeur qui prend tous les mots 4 caractères ou plus, et les stocke dans une base de données ainsi que combien de fois le mot a été utilisé.

Je dois exécuter ce indexeur sur 4 000 fichiers txt. À l'heure actuelle, il faut environ 12-15 minutes - et je me demande si quelqu'un a une suggestion pour accélérer les choses

Actuellement, je suis en plaçant les mots dans un tableau comme suit:

// ==============================================================
// === 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;
}

Je pense que le plus grand goulot d'étranglement au moment est le script pour stocker les mots dans la base de données. Il a besoin d'ajouter le document à la table des essais et si le mot existe dans la table juste ajouter essayid (fréquence du mot) sur le terrain, si le mot ne marche existe, puis ajoutez-le ...

// ==============================================================
// === 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");
        }
    }
}
Était-ce utile?

La solution

Vous pourriez envisager de profiler votre application pour savoir exactement où sont vos goulots d'étranglement. Cela pourrait vous donner une meilleure compréhension de ce qui peut être amélioré.

En ce qui concerne l'optimisation des DB: vérifier si vous avez un index sur la colonne de word, essayez abaisser le nombre de fois que vous accédez à DB. INSERT ... ON DUPLICATE KEY UPDATE ..., peut-être?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top