次の整数の配列があるとします。
array(1, 2, 1, 0, 0, 1, 2, 4, 3, 2, [...] );
整数は最大100万エントリになります。ハードコーディングされる代わりに、事前に生成され、JSON形式のファイル(サイズは約2MB)に保存されています。これらの整数の順序は重要です。一貫性があり、同じインデックスで常に同じ値を持つ必要があるため、毎回ランダムに生成することはできません。
このファイルを後でPHPで読み戻す場合(たとえばfile_get_contents
+を使用json_decode
)、配列を元に戻すだけで700〜900ミリ秒かかります—「わかりました」「json_decode
約200万文字を解析する必要があるので、おそらく妥当だと思いました。キャッシュしましょう」 。APCはそれを約68MBのエントリにキャッシュしますが、おそらく通常のzvalsは大きいです。ただし、このアレイをAPCから取得するには、600ミリ秒もかかりますが、これはまだあまりにも多くのことです。
編集:APCは、シリアル化/逆シリアル化してコンテンツを保存および取得します。コンテンツは、100万個のアイテム配列を使用すると、時間と手間がかかります。
だから質問:
データストアやメソッドに関係なく、PHPで100万エントリの配列をロードする場合、このレイテンシを期待する必要がありますか?私が理解している限り、APCはzval自体を格納するので、理論的にはAPCからの取得は可能な限り高速である必要があります(解析、変換、ディスクアクセスなし)なぜAPCは、一見単純に見えるものに対して非常に遅いのですか?PHPを使用して100万エントリの配列を完全にメモリにロードする効率的な方法はありますか?RAMの使用量が問題ではないと仮定します。
インデックスに基づいてこの配列のスライスのみにアクセスし(たとえば、インデックス15からインデックス76にチャンクをロードする)、実際に配列全体をメモリに保存しない場合(はい、これは正しい方法であると理解していますが、すべての側面を知りたい)、完全なアレイのための最も効率的なデータストアシステムは何でしょうか?明らかにRDBMではありません。redisを考えていますが、他のアイデアを聞いていただければ幸いです。