LoglessLove

愛は常に上書き保存 新ブログ→ http://www.loglesslove.net/blog

全体表示

[ リスト ]

上策 アップロードファイルを一旦サーバに置き、バックグラウンドで登録/変更/削除
中策 アップロードファイルから直ちに登録/変更/削除
下策 アップロードファイルから一旦配列を作ってから、登録/変更/削除

WEBページで商品CSVをアップロードしてDBに対して登録/変更/削除を行うページの開発を最近よくやるようになった。普段ブラウザから画像をアップするような感覚で行う、アレ。

やることリストは以下。
1. CSVからデータを取る。
2. 取ったデータをDBのテーブルレイアウトに合うように変更する。
3. DBに放り込む。

何も考えず、わかりやすいのがいいだろうと思って「下策」を採っていた。
混沌とした商品CSVから1行を取り出し、テーブルレイアウトに合致するように値を設定し、配列に1行追加する、ということを件数分行う。
やることリストでいうと1と2を完了させてから、3を行う形だ。

ところが、商品件数が数万件になってくるとメモリ不足で怒られて処理ができなくなることがある。特にレンタルサーバーは怒りっぽい。
数万件の商品データ全部を格納した配列を一度つくるから、無駄にメモリを食ってしまう。

ということで、「中策」を採ることにした。全体の配列を一度作るということをせずに、CSVから1行取り出してテーブルレイアウトに合わせ、その1行をDBに放り込む。
やることリスト1〜3までを件数分繰り返す。
これで無駄にメモリを食うことはなくなった。
今はリソースが潤沢にあるとはいえ、どんな無駄も許されるというわけじゃない。
日常生活にたとえてみると、年収2000万円だけど家賃月600万円の高級マンションに住むようなもので、そりゃアンタ金持ってますが限度があるでしょう、といったところだ。

こうしてメモリの問題は解決した。ところが、数万件もあると処理完了までに数十分かかることがあり、CSVをアップロードすると完了までそのままブラウザが固まってしまう。
いくら待っても画面が真っ白、まだ処理が続いているのかな、と調べてみるととっくに完了しているといったようなことが、よくある。
日常生活にたとえてみると、5分だけ首絞めるから我慢してね、と5分間首を絞めていたら、本当にあの世に行ってましたという感じ。
では5分間首を絞めるとあの世に行くので、首を絞めるのは30秒ずつにしてくださいねとか、そんな注意をユーザーに求めることは難しい。操作としてできることはついやってしまうからだ。
帰るときは戸締りをしてくださいといわれても、戸締りをしないで帰ることができるから、戸締りを忘れてしまう。それと同じ。

さあどうしたものかと悩むふりをしていたある日、他のサービスのCSVからの商品登録を見て「(・∀・)ソウダッタノカ!!」と納得した。それはたぶんこうだろうということで「上策」を採用する。
CSVファイルをアップロードしたところで、そのファイルをサーバー上の適当な場所に放置する。
それでPHPのsystem()関数で別のプログラムを実行する。このプログラムはやることリスト1〜3をバックグラウンドでやってくれる働き者だ。
そうやって働き者に仕事を丸投げしたところで、このアップロード用プログラムの仕事は完了する。
数十分後には商品登録処理も完了しているだろう、果報は寝て待て、という想定。

ここで働き者のバックグラウンド商品登録さんが、さらに進捗状況をファイルかDBに書き出してくれていると、アップロード後丸投げさんのところのHTMLでjavascriptが動いて進捗状況をブラウザに表示する、ということもできる。

あとは商品登録処理の中止(system()でkillする)があると、いいかもしれない。登録処理中にもう一度アップロードされることなどを考えると。「何か食べる前には嘔吐して胃と腸を空にしておきましょうね」設計。

この記事に

閉じる コメント(0)

コメント投稿

顔アイコン

顔アイコン・表示画像の選択

名前パスワードブログ
絵文字
×
  • オリジナル
  • SoftBank1
  • SoftBank2
  • SoftBank3
  • SoftBank4
  • docomo1
  • docomo2
  • au1
  • au2
  • au3
  • au4
投稿

.


みんなの更新記事