1

テキストファイルからさまざまなデータをインポートするためのPHPスクリプトがあります。

インポートは非​​常に複雑で、私のテストファイルには32.000のエントリがあります。これらのエントリは解析され、mysqlデータベースに挿入される必要があります。

スクリプトを実行する場合、完了するまでに30分かかります...そしてこの時点で、サーバーのCPUは99%アイドル状態です。

マシンからより多くの電力を使用しているphpとmysqlを最適化する機会はありますか?

コード:

if ($handle = @fopen($filename, "r")) {

    $canceled = false;
    $item = null;
    $result = null;

    while (!feof($handle)) {
        $buffer = fgets($handle, 4096);
        $line = $buffer;

        if (substr($line, 0, 2) == '00') {

            continue;
        }
        else if (substr($line, 0, 2) == '99') {
            continue;
        }
        else if (strlen($line) < 75) {
            continue;
        }

        Reread:
        if ($canceled) {
            break;
        }

        if ($item == null) {
            $item = new DA11_Item();
            $item->boq_id = $boq_id;
        }
        $result = $this->add_line_into_item($item, $line);

        if ($result == self::RESULT_CLOSED) {
            $this->add_item($item);
            $item = null;
        }
        else if ($result == self::RESULT_REREAD) {
            $this->add_item($item);
            $item = null;
            goto Reread;
        }
        else if ($result == self::RESULT_IGNORD) {
            if (count($item->details()) > 0) {
                    $this->add_item($item);
            }
            $item = null;
        }
    }

    if ($item !== NULL) {
        $this->add_item($item);
    }

    fclose($handle);
}

add_itemは$item->save()を実行し、それをデータベースに保存します。

thxと親切なよろしく、viperneo

4

3 に答える 3

1

あなたが抱えている問題の1つは、すべての挿入が、その応答を含むdb-serverへの個別の要求であるということです。32.000レコードを使用すると、これは非常に大きなオーバーヘッドであることがわかるかもしれません。一度に1000レコード(たとえば)に一括挿入を使用する

INSERT INTO foo (col1, col2) VALUES
  (1,'2'),
  (3,'4')
  -- 997 additional rows
  (1999, '2000');

追加のトランザクションが役立つ場合があります

アクティブレコードについて言及されたため、更新してください。このような大量インポートタスクでは、追加の抽象化レイヤーを使用しないことをお勧めします。

于 2012-08-07T11:48:49.583 に答える
0

Florentがコメントで述べているように、MySQLエンジンは遅すぎてリクエストを処理できません。MySQLデータベースを(HDDではなく)SSDに移動すると、速度が大幅に向上します。

于 2012-08-07T11:47:54.357 に答える
0

最適化できることがいくつかあります。

しかし、最もパフォーマンスが高いのはMySQLデータベースだと思います。結合されたテーブルの一部のインデックスが大幅な速度をもたらす可能性があります。最初に確認する必要があります。

Linuxシステムを使用している場合は、mysqltunerを使用してデータベースを最適化できます。

2番目の方法は、コードを最適化し、以前に同じことを行ったときにデータベースからいくつかの結果をキャッシュすることです。

于 2012-08-07T11:48:23.590 に答える