797395 ランダム
 HOME | DIARY | PROFILE 【フォローする】 【ログイン】

まんじうこわい@楽

まんじうこわい@楽

【毎日開催】
15記事にいいね!で1ポイント
10秒滞在
いいね! --/--
おめでとうございます!
ミッションを達成しました。
※「ポイントを獲得する」ボタンを押すと広告が表示されます。
x

PR

Keyword Search

▼キーワード検索

Calendar

Profile

hknopage

hknopage

Free Space

Category

Freepage List

2009.11.17
XML
カテゴリ:PHP
 初回アクセスだけ計算を行い、結果をファイルへ保存して、2回目以降はファイルからデータを読みたい場合がある。

 ファイルの保存形式でserializeとtsvのどちらで保存しようか迷っていた。
 どちらの方が高速に処理を行えるのか調べてみた。
ファイル形式別読み込み速度比較
 こちらのページによると、serializeが圧倒的に速そう。
 しかし、テスト内容を見ると少量のデータを何回も読み込む場合っぽい。
 私が想定しているのは、2回目以降ページアクセス時に、大量のデータをファイルから一度だけ読み込む場合。
 試してみた。

※環境によっては必ずしもこの結果になるとは限りません。
 参考程度に。
 あと、関数の引数なんかは端折ってます。

--実験--
データ量:約13万行
serialize:配列データをserializeで変換して、ファイルへ出力。ファイルから読み込んでunserializeし、配列としてそのまま利用。
tsv:配列データをtsv形式にしてファイルへ出力。ファイルから1行ずつ読み込んでパース。配列へ挿入し利用。

まずは13万行をファイルへ出力する
-出力処理-
serialize:file_put_contents(serialize())
tsv:fopen()=>foreach=>データをタブで連結=>fwrite()=>fclose()
-出力時間-
serialize:約3.4秒
tsv:約2.7秒
-出力ファイルサイズ-
serialize:約46MB
tsv:約12MB

出力時間と出力サイズにおいて、tsvの方がやや有利だった。

-入力処理-
serialize:unserialize(file_get_contents())
tsv:fopen()=>while=>fgets=>末尾の改行削除&タブでデータ分け=>配列へ挿入=>fclose()

-入力時間-
serialize:約184秒
tsv:約7秒

入力でかなりの差が出た。
unserializeの処理が結構しんどそう。
ここまで差がつくとは・・・
でかいファイルを一気に読ませているからserializeの方が遅いのかなと思って、file_get_contentsを外に出してみた。
file_get_contents:0.128秒
unserialize:186.220秒
うーん・・・どうやら単に大量データをunserializeするのが遅いだけっぽい。

unserializeはサーバースペックに左右されそうですが、大量のデータを扱うのにはあまり向いてなさそう。
serializeを使うかtsvにするかは、まあケースバイケースですね。


-------2010/01/27:追記--------

 これは、一気にserialize&unserializeと行単位(1件ずつ)tsv処理を比較してる。
 この事から分かったのは、大きなデータを一気にserializeで扱うには向かないって事。
 タイトルのserialzieとtsvの比較にはなってないなorz
 勘違いされた方いたらすいませんでした。

 そして更に思ったのが、これっていいとこ取りしたら最速じゃ・・・?
 某サイトによると少量データを扱う場合はserializeが早かった。
 ならば1行分(1件分)のデータをserialize/unserializeして扱えば早いんじゃないか?!
 そして試してみたら・・・
 2.4s(tsv) => 1.4s(serialize)
 1秒早くなったー。
 tsvの加工処理がなくなったおかげかな・・・?

 どれがいいかはその時々で判断してください。

=>何か色々自信がないので余計な処理が無いテストスクリプトを作って実験





お気に入りの記事を「いいね!」で応援しよう

Last updated  2010.02.03 23:49:57
コメント(0) | コメントを書く



© Rakuten Group, Inc.