50万ほどレコードのある DB のテーブルから、1レコードずつ読み出して、ひとつのフィールドの値(10桁の10進数)を1秒に1回ずつインターネットの向こうに投げる。
ひとつだけなら良いのだが、同時に何本も走ると DB への負荷が重たくなりすぎるので、最初にまとめて読み出して、DB へのアクセスを減らすことにした。
10進で10桁だから 4byte の int に収まる。500,000 × 4 = 2,000,000。メモリ 4G の Linux で動いているのだからこれぐらいは問題ないだろうと配列に放り込んでいったら、途中でインタープリターがひとつのプログラムに割り当てるメモリの最大値 16M を使い切ったとエラーが出てくる。
PHP ってフツーの配列も連想配列として扱ってるの ???
フツーの Linux 屋さんなら使い捨ての名前のテンポラリファイルを作ってそこに吐き出させるのだろうが、面倒くさいのでバイナリー変換して文字列として並べた。要は C の配列を自前で作った。久しぶりのバイナリ操作だったので嵌るかと思ったが、意外とあっさり動く。
この辺は組み込み屋の血だろう。
一緒にコードをメンテしている相方は元 Java プログラマ。こういうロジックを見たらなんというか...。
ま、ツールだから良いことにしよう (^^;
0 件のコメント:
コメントを投稿