2

MySQL DB にインポートしたいデータを含む複数の CSV ファイル (現時点では 150k ~ 500k 行) があります。

これは現時点での私のワークフローです:

  1. db の一時テーブルにファイルをインポートします (生の行)
  2. 一度に 1 行を選択し、それを配列に展開し、クリーンアップしてインポートします。

すべてのアイテムには画像があり、curl を使用してダウンロードします。ダウンロードした後、codeigniters resizer (gd2) でサイズを変更します。この両方の手順は絶対に必要であり、時間がかかります。コンテンツを最新の状態に保つために、毎日新しいファイルを削除して再インポートする必要があります。

一時的なデータベース保存の理由は、crontab を使用してインポート スクリプトの複数のインスタンスを生成できるかどうかを確認するためでした。これは私が望んでいた結果を与えませんでした。

これを「高速」な方法で行う方法について、設計上のアイデアはありますか?

このサイトは、4GB 1.8 GHz デュアル コアの専用サーバーで実行されています。

ありがとう :)

4

2 に答える 2

2

MySQL には、LOAD DATA INFILEまさにあなたがやろうとしているように聞こえるという機能があります。

質問からは、すでに使用しているかどうかわかりませんか? しかし、たとえそうであったとしても、やり方を改善できるように思えます。

次のような SQL スクリプトが役に立ちます。

LOAD DATA INFILE filename.csv
INTO table tablename
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
(
  field1,
  field2,
  field3,
  @var1,
  @var2,
  etc
)
SET
  field4 = @var1 / 100,
  field5 = (SELECT id FROM table2 WHERE name=@var2 LIMIT 1),
  etc

これはかなり複雑な例で、CSV データをテーブルに直接インポートし、それを正しい形式に一度に操作する方法を示しています。

これの素晴らしいところは、実際には非常に速いということです。これを使用して、毎週 500,000 件のレコード ファイルをインポートします。ファイルを読み取って DB に書き込む PHP プログラムよりも桁違いに高速です。PHP プログラムから実行しますが、PHP はインポートの責任を負いません。MySQL は、1 つのクエリからすべてを実行します。

私たちの場合、インポート データを何度も操作しますが、マスター テーブルに入る前にさらに約 10 の処理ステップがあるため、一時テーブルに書き込みます。しかし、あなたの場合、この方法は一時テーブルをまったく使用する必要がないように思えます。

MySQL マニュアル ページ: http://dev.mysql.com/doc/refman/5.1/en/load-data.html

画像のダウンロードに関しては、インポートされたレコードのどれが更新されたかを監視し、変更されたレコードの画像のみを取得する以外に、どのように速度を上げることができるかわかりません。しかし、それが実行可能な解決策である場合、おそらくすでにそれを行っていると思います。

それでも、MySQL の提案がお役に立てば幸いです。

于 2012-11-13T20:59:47.877 に答える
1

最も速いのは、スレッド化を使用することです。

1つはMySQLに接続し、もう1つは画像をダウンロードしてサイズ変更し、CSVを開き、fgetsなどを使用して読み取り、各行で、データベースに挿入するStackableを作成し、そのstackableをに渡します。ファイルをダウンロードし(データが保存されている行のIDを知っている)、サイズを変更する別の方法。画像用に複数の作業者を雇用したい場合があります...

http://docs.php.net/Worker

http://docs.php.net/Stackable

http://docs.php.net/スレッド

(必ず docs.php.net を参照してください。ドキュメントのビルドは少し遅れています)

http://pthreads.org (物事がインデックスで見つかる仕組みの基本的な内訳)

http://github.com/krakjoe/pthreads (ローカルでテストする場合は、ここから Windows をダウンロードできます)

http://pecl.php.net/package/pthreads (最後のリリースは少し古くなっています)

于 2012-11-14T08:37:21.330 に答える