5

解析して MySQL データベースに挿入しようとしている大きな csv ファイル (約 700MB) があります。csv (約 4x10^6 行) を 1 行ずつ読み取り、レコードを解析して挿入します。次に、バッチごとに約 10,000 レコードのバッチでデータベースにレコードを挿入します。解析中にいくつかの処理があります。たとえば、11d 12:34:56を使用して形式の期間を時間数に変換しpreg_matchます。

preg_match('/(?P<days>\d+)d (?P<hours>\d+)?P<minutes>\d+)?P<seconds>\d+)/', $hoursUsed, $matches);

スクリプトがファイルを完全に解析し、すべてのレコードをデータベースに挿入するには、約 40 分かかります。ここでの質問は次のとおりです。 * 予想される時間は? 40分って普通なのかな?* csv ファイルの解析は

PHP でサイズが約 700MB (約 4x10^6 行) のファイル (csv) を解析していますが、ファイルの解析に約 40 分かかります。解析を最適化しようとしていますが、最適化できるのは 45 分から 40 分です。私の質問は次のとおりです。

  • 予想される時間は?40分って普通なのかな?
  • ファイルが完全に解析され、すべてが挿入されるまで応答がないので、リクエストでこれを行います。これを非同期プロセスに委任するより良い方法はありますか?

参考までに、CakePHP を使用しています。

4

2 に答える 2

2

を使用LOAD DATA INFILEすると、処理が大幅に高速化されます。期間値をCHARフィールドにロードし、MySQL が後で処理するようにします。

そうすれば、データ処理をデータベースに任せることができ、PHP よりも大幅に高速になります。

さらに、700MB と 400 万レコードの場合、40 分はそれほど悪くないように聞こえます。もちろん、それはすべてコード、マシンなどに依存します.

于 2012-10-02T10:22:32.527 に答える
0

LOAD DATA INFILE可能であればコマンドを使用してください。めちゃくちゃ速いです。 http://dev.mysql.com/doc/refman/5.1/en/load-data.html

オプションFIELDS TERMINATED BY ','LINES TERMINATED BY '\n'

PHP からこのようなステートメントを実行できるはずですが、ファイル パスは完全で、MySQL にアクセスできる必要があることに注意してください。また、mysql サーバーが PHP ファイルシステムの別のホストにある場合は、回避策が必要になる場合があります。

于 2012-10-02T10:24:41.343 に答える