Frage

Ich habe eine Herausforderung gesetzt wurde einen Indexer zu erstellen, die alle Wörter 4 Zeichen oder mehr dauert, und speichert sie in einer Datenbank zusammen mit, wie oft das Wort verwendet wurde.

Ich habe diese Indexer auf 4.000 txt-Dateien auszuführen. Derzeit dauert es etwa 12 bis 15 Minuten - und ich frage mich, wenn jemand einen Vorschlag für die Beschleunigung Dinge hat bis

Zur Zeit bin platzieren ich die Worte in einem Array wie folgt:

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

Ich denke, der größte Engpass im Moment das Skript die Wörter in der Datenbank zu speichern. Es muss das Dokument in den Essays Tabelle hinzuzufügen und dann, wenn das Wort in der Tabelle existiert nur Anfügen essayid (Häufigkeit des Wortes) auf das Feld, wenn das Wort tut existiert, fügen Sie dann ...

// ==============================================================
// === 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");
        }
    }
}
War es hilfreich?

Lösung

Sie sollten erwägen Ihre App Profilierungs genau zu wissen, wo die Engpässe sind. Dies könnte Ihnen ein besseres Verständnis dessen, was verbessert werden kann.

In Bezug auf DB-Optimierung: Prüfen Sie, ob Sie einen Index auf word Spalte haben, dann versuchen Sie die Anzahl der Senken Sie DB zugreifen. INSERT ... ON DUPLICATE KEY UPDATE ... vielleicht?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top