FuelPHP:ORMの性能とメモリ消費
FuelPHP
FuelPHP の ORM はとても便利なのですが、非常に重たく、またメモリも消費することを実感することがありましたので、簡単に検証してみました。
以下は、ORM と DB::query を使った際の所要時間とメモリ消費量の比較です。
やっていることは、単純にあるテーブルのレコード全てを取得しているだけです。
ORM
$start = microtime(true); print memory_get_usage() . "\n"; \Model_Files::find('all'); print memory_get_usage() . "\n"; print microtime(true) - $start . "\n";
DB::query
$start = microtime(true); print memory_get_usage() . "\n"; \DB::query('SELECT * FROM files')->execute()->as_array(); print memory_get_usage() . "\n"; print microtime(true) - $start . "\n";
最初に、SQL を発行する前のメモリ消費量を表示していますが、いずれも 3104040 でした。
上記を実行した結果は、以下の通りです。
メモリ消費 | 所要時間 | |
---|---|---|
ORM | 346258536 | 7.7509891986847 |
DB::query | 3870752 | 0.90459394454956 |
ORM ダメダメすぎる。。。。
ちなみに、レコード数は 6~7万件程度です。
実は、今回いろいろと問題を実感したのは、いわゆるバッチ処理です。
バッチ処理に ORM のような重たい実装を使うこと自体がいかがなものかという話は百も承知ですが、せっかくフレームワーク使ってモデルもきっちり作ったのであれば、やはりそれに則った方法でバッチ処理も行いたいと思いますよね。
例えば、UPDATE や DELETE の一括更新/削除であればもちろんモデル無視でもOKだと思うのですが、普通に検索して1レコードずつ何らかの処理を行う、、、、といったケースであればやはりモデルを使って処理したいところです。
しかしながら、所要時間で1桁、メモリ消費量に至っては桁が2つ違いますからね。
さすがにこれは使い物にならん、、、と言わざるを得ません。
しかも、たかだか6~7万件だし、DB 自体はこのテーブル1つしかないというこれ以上ないシンプルな DB です。
1レコードあたりのサイズも 10KB もない程度。
このレベルで 300MB 以上のメモリが必要になるとかちょっとあり得ないですね。
実際、DB::query の方は 3MB 程度で済んでるわけだし。
ちょっとビックリな結果でした。。。
結論としては、、、、FuelPHP で大量データを扱う場合には注意が必要であるということですな(^_^;