新年早々技術の話
とまぁ、自分の素人ぶりも暴露しつつ。。。(笑;)
去年納品したシステムが止まってしまったので新年早々その復旧作業に追われながら早1週目が過ぎてしまった。。。(1週目と言っても木金のみだが)
しかもまだ解決されていない。。。orz;
「3万5千件のデータで止まるって、ある意味凄いシステムだね」
偉人に皮肉られた(笑)。まぁ、事実だから否定しようがない。。。(泣;)考えてみればリレーションが幾つか貼られているデータを一度に3万5千件分も処理するシステムなんて今まで扱ったことなかったわ。。。ちなみにデータ数は今ある3万5千がほぼ上限で、この後また一旦全部クリアし、リセットされる、とのこと。
だからと言っても止まっているのではいけまへん。実際、仕様変更に伴って強引なSQL処理をしていたところが止まった一番の理由ではあるが、言い訳並べる前にさっさと対処せねば。。。
PHP4、MySQL、&フレームワークにCakePHPを使っています。
往生しながら、助けも得ながら、お陰さまで何とか概ね解決してきている。解決、と言うより応急処置に近いが(笑;)。
今回の体験で得た自分なりの学びを言えばフレームワークとかオブジェクト指向ってのはその性質上結構重い、ので、扱っているデータ数が多くなり、処理に負担がかかりすぎるような所はプロシージャで対処することにした。いかがなもんだろうか??
後、RailsのConventionに逆らうことではあるが、元々ハッシュの名前が「subscripton_date」とか、「total_poits」みたいに長い名前だったところを「s」とか「t」とか、1文字にしたことによってかなり、かなり、負荷が減った。
結局本来かかっていたメモリ負荷を10倍以上軽くすることに成功、一番問題だったところはそれで解決できた。良かった、良かった。
しかし、まだ解決していないところが残っている(泣;)。先方も殆どいじらないところだとは思うが、その3万5千件のデータを一気にCSV出力すると言う処理。たまたまだが、気付いてしまったからには何とか対処せねば。。。
上記と同じ手順で以前よりも軽くすることは出来たが、まだまだ、まだまだ、重い。上記処理は3万5千件のデータを一時的に処理し、処理が終わったら変数を破棄、メモリを解放して済む話だが、このCSV出力においてはそいつら3万5千件全てのデータ、プラス、JOIN先のデータ全てを含む内容を処理の最後の最後まで保持し、ダウンロード画面が出るところまで持っていかなければならない。
数千件ぐらいまでは開発環境で確認できていたが、考えてみれば3万5千件って。。。処理しながら全部吐き出すのにはかなりの量だにゃ。。。
A(^-^;)~~
今更吐き出す件数に制限をかける、なんてわけにはいかんだろうし。。。
システム開発の洗礼を受けているような気がする。。。何か以前にも言ったことがあるようだが(笑;)。
既に解決した上記処理とは異なり、今回はSQL自体は比較的すぐに返ってくる。只取ってくるだけなので。しかし、JOINする前のデータを一旦配列変数に持たせるだけでもメモリが数十MBに跳ね上がる。全部JOINしたデータを配列変数に代入したら100MBを軽~く超える。
現在、自宅で配達物待ちで待機中。物が届き次第事務所に戻ろうと思っているんだが、今考えているのは、SQLで取ってきたレコードを配列変数には入れずに、1レコードずつそのままCSV用の文字列になるまで処理し、CSV用の変数に文字列として付け足していく。
配列変数に入れず、データ文字列、区切りのカンマ、行末の改行文字コードが繋がっている1つの長~い値になり、3万5千件分を一気にCSV出力をする、と言う内容。
文字列だけでも1レコード半角英数字にして200文字ぐらいはあると思う。。。かける3万5千となるとCSV出力用変数が持つデータ容量だけでも8MBする。ハハハ・・・W(^o^;)~~
なんだかんだバックでフレームワークは動いていて、hello worldだけでも2MBのメモリを使っている。後は処理にかかる容量がどれだけか、と言うところ。メモリ使用容量を全部で合計16MB以内に収めれたらひとまず良しとしようと思っている。そこまで抑えれたら多い分は.htaccessで調整しようかと。。。
この方法で上手く行かなかったらどうしよう。。。空のCSVファイルを育成、オープン、1レコードずつ直接CSVファイルに出力し、その都度1レコード分のメモリを破棄しながら1件ずつデータを書き込んでいく、最後にクローズし、ダウンロードと言う方法はどうか。。。時間はかかりそうだが変数を破棄する分、容量はかなり抑えれると思う。只、この方法だとサーバー上にCSVファイルが残ってしまうのでそれをまた何らかの処理で削除する必要がある。
荷物来た、シャワー浴びて事務所行くぜよ。
助言、アドバイス大歓迎っ;
走れ、れい、待ってろ、ラリー!!(爆)
広ブロっち♪ d(^-^)
コメント
CSV をファイルに書き出すという方法もひとつの手ですね。Rails でどーやるのかよくわからないのですが、ファイルに書き出さず HTTP のレスポンスに直接書き出すといいカモ。
投稿者: 「た」 | 2007年01月06日 12:48
>「た」さん
CSVファイルに書き出す、それ正解でした。
お陰さまで100倍軽くなりました(笑;)。
メモリで管理する手法をずっと教えこまれてきたようで。。。初心大切っす。
助言、ありがとうございました。m(_ _)m
投稿者: 余事の管理人 | 2007年01月08日 10:42