質問: 大量件数のinsert or update を繰り返すバッチでの注意点 phpで、postgresに対して大量(3万件前後)のinsert、 もしくはupdateを繰り返すバッチ処理を実装しております。 当方、php歴が浅く、phpで大量件数を取り扱う際の注意点やtipsなどの知識が 乏しく、処理速度の改善や、メモリ使用量の軽量化などを行いたいのですが、 どこから手を付けてよいのやら取っ掛かりすら掴めない状況です。 そこで、有識者の皆様にお伺いしたいのですが、 phpで大量件数を処理するにあたって、 1.処理速度の改善に役立つtips 2.メモリ使用量の軽量化に役立つtips この2点をお伺いしたく、何卒宜しくお願い致します。
回答: 1.処理速度 単純にinsertで済む場合はcopy文やpsqlによる手続きが便利かも知れません。 updateとinsertがどちらも含まれる場合、最初にinsertとupdateの二つに分けてしまった方が早いかも知れません。 select primary_column from table_name where primary_column in (プライマリーキーの配列3万前後); とかで。 primaryキーが40バイトだったとしても、1mb程度のメモリ量で済みそうです。 2.メモリ使用料について 3万件のデータはファイルに入っていると思うので、単純にfopen+fgetsにしてやればそれほどメモリは使わないんじゃないかと思います。 memory_get_usage()関数を使えれば、実際にメモリ量を見てやると良い気がします。 メモリやphpの処理よりも、postgre側やcpu、iowaitの方が厳しくなりそうな気がしますし、問題が発生したら考えてみてはいかがでしょうか。 php上ではout of memoryかset time limitくらいでしか止まらない気がします。 マシンスペック次第ではcpuが100%行きそうですね。 なんか取り止めが無かったのですが、そんなところでいかがでしょうか。。