假设您有以下整数数组:
array(1, 2, 1, 0, 0, 1, 2, 4, 3, 2, [...] );
整数最多可达一百万个条目;只是它们没有被硬编码,而是预先生成并存储在 JSON 格式的文件中(大小约为 2MB)。这些整数的顺序很重要,我不能每次都随机生成它,因为它应该是一致的并且总是在相同的索引处具有相同的值。
如果之后在 PHP 中读回该文件(例如使用file_get_contents
+ json_decode
),则需要 700 到 900 毫秒才能将数组取回——“好吧”我想,“这可能是合理的,因为json_decode
必须解析大约 200 万个字符,让我们缓存它” . APC 将其缓存在大约 68MB 的条目中,可能是正常的,zval 很大。然而,从 APC 取回这个数组也需要 600 毫秒,这在我看来还是太多了。
编辑:APC 确实序列化/反序列化以存储和检索具有一百万个项目数组的内容是一个漫长而繁重的过程。
所以问题:
如果我打算在 PHP 中加载一百万个条目数组,无论是数据存储还是方法,我是否应该期待这种延迟?据我了解,APC 存储 zval 本身,因此理论上从 APC 检索它应该尽可能快(无解析,无转换,无磁盘访问)为什么 APC 对于看似简单的事情如此缓慢?有没有任何有效的方法可以使用 PHP 将一百万个条目数组完全加载到内存中?假设 RAM 使用没有问题。
如果我要根据索引仅访问该数组的切片(例如,将块从索引 15 加载到索引 76)并且实际上永远不会将整个数组放在内存中(是的,我知道这是明智的做法,但我想知道所有方面),对于完整的阵列,最有效的数据存储系统是什么?显然不是 RDBM;我在考虑redis,但我很乐意听到其他想法。