【发布时间】:2012-07-26 23:33:07
【问题描述】:
假设您有以下整数数组:
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 使用没有问题。
1234563这样做,但我想知道所有方面),对于完整的阵列,最有效的数据存储系统是什么?显然不是 RDBM;我在考虑 redis,但我很乐意听到其他想法。
【问题讨论】:
-
你试过SplFixedArray吗?
-
@Buddy 是的,差别不大,可能使用更少的内存,但 APC 需要同样长的时间。
-
如果数字很小并且数组是静态的,你不能用一个1Mb的字符串对象来代替吗?
-
@6502 好主意。我会调查一下。
-
Redis lists 也值得一试。这里唯一的问题是您需要将整数存储为字符串,但我肯定会尝试这样做。
标签: php apc large-data