2012-03-04 12 views
8

file_get_contentsを使用してディスクからXMLファイルをロードしています。テストとして、file_get_contents()を3.99秒で1000回使用して156Kファイルを読み込むことができます。ロードを行い、memcacheレイヤーに置き換えた部分をサブクラス化しました。私の開発マシンでは、4.54秒で同じドキュメントを1000回読み込むことができます。なぜfile_get_contentsはmemcache_getより高速ですか?

file_get_contents()がキャッシュを行うことをお勧めしますが、実際にはよく知られているキャッシュテクニックよりも速いようです。単一のサーバー上では、file_get_contents()のパフォーマンスは得られますか?

Macports、OS X 10.6.8でPHP 5.2.17を使用しています。

編集:このサイズのXML文書では、MEMCACHE_COMPRESSEDフラグを使用すると小さな利点があります。 memcacheによる1,500ロードは、6.74(without)ではなく6.44 sec(圧縮あり)で実行されます。しかし、どちらも遅いですfile_get_contents、5.71秒で同じ数の負荷を行います。

答えて

8

file_get_contents mmapがファイルであるため、ファイルシステムコールが少数しかないため、ファイルシステムのキャッシュに残ります。 memcacheは、memcached(およびクラスタ化された実装上のサーバー外)へのアウトオブプロセス呼び出しを含みます。

file_get_contents()のパフォーマンスは、ファイルシステムの種類によって大きく異なります。たとえば、NFSマウントされたファイルシステム上のファイルはmmapされていないため、このアクセスは遅くなります。また、マルチユーザーサーバーでは、ファイルシステムのキャッシュが他のプロセスによって急速にフラッシュされる可能性がありますが、memcachedキャッシュはほぼ確実にメモリに格納されます。

+0

ああ、面白いです。あなたは、さまざまなXMLファイルが常にロードされているWebサーバー上で、Memcacheアプローチのパフォーマンスがいくつかのケースでより良いと言いますか? (おそらく512MBのRAMを搭載した、ローエンドのLinux VPS上に展開することを期待しています.Memcacheがデフォルトで予約するデフォルトの64Mは無料です。) – halfer

+0

でも、FSキャッシュから何かをノックアウトするという競合は、memcacheキャッシュから何かをノックアウトする可能性が高いのだろうかと疑問に思う。 – halfer

+0

1つのアプリケーション専用のVPSでは、すべてに合うようにしてください。しかし、あなたのキャッシュを "適切なサイズにする"価値があります:もし十分であれば、Memcache以下で32Mを使用してください。アプリがPHPベースの場合は、APCまたはXcacheを使用していることを確認してください。 MySQLを使用している場合、MySQLキャッシュをチューニングすることでパフォーマンスの良い配当を得ることができることを忘れないでください。512Mbは十分に小さく、賢明に割り当てる必要があります。 – TerryE

3

file_get_contentsは、ファイルを取得する最も簡単な方法です。基礎をなすオペレーティングシステム(特にlinux)は、すでに効率的なキャッシュメカニズムを持っています。あなたがするだけで、オーバーヘッドが発生し、状況が遅くなります。

Memcacheは、これらのファイルをリモートからロードした場合に意味があります。

編集:file_get_contentsが最も簡単な方法であるとは限りません。 fopen/fget かもしれないさらに高速である - 私は知らない。ただし、キャッシングレイヤーの複雑さに比べてその差は小さいはずです。

+0

私はあなたが正しいと思います。私は 'file_get_contents'がいつも_some_ディスクアクティビティを実行することを期待していたと思いますが(おそらく、ファイルが変更されたかどうかを確認するため)、' memcache_get'はまったく何もしなくてもかまいません。それで、memcacheのアプローチがもっと速くなると私は期待しています...それでも、私は何かを学んだと思うので、時間の無駄ではありません:) – halfer

+0

非常に一般化されたレベルでは、FSキャッシュはPHP memcache - それははるかに専門的であり、スクリプト言語で書かれていないことを除いて。 :)ファイルの内容が変更されない限り、キャッシュは2回目にファイルにアクセスする必要はありません。 ファイルキャッシュをフラッシュするシステムにIOアクティビティがたくさんある場合、別のキャッシュメカニズムが有効です。 – Someone

+0

@TerryEのティック、Mantriurの+1、どちらも非常に役に立ちます。ありがとうございました。 – halfer

1

memcacheにXMLファイルを格納することは、私にはほとんど意味がありません。

私はむしろ解析値を保存したいので、読み込みと解析の両方を節約できます。

+0

確かに、それは私の元の意図でした。私は、SimpleXMLオブジェクトをシリアライズできないことを発見しました。どうやらこれらのリソースにはリソースが含まれています。もちろん、これらのリソースはシリアル化された形では適切に表現できません。 – halfer

+0

のリソースですか?どのようなリソースですか? –

+0

リソース:[この回答](http://stackoverflow.com/a/5264628/472495)を参照してください。 – halfer

関連する問題