缓存大型数组


Caching large arrays

我有以下功能:

function f($idx, $arr) {
    static $a;
    if ($a == NULL) {
        foreach ($arr as $v) {
            $key = $v['key'];
            if (!isset($a[$key])) {
                $a[$key] = array();
            }
            $a[$key][] = $v;
        }
    }
    return $a[$idx];
}

初始条件为:

  1. 函数f()在一次请求中被多次调用
  2. $arr总是非常大
  3. $arr在不同的函数调用中可能不同(低基数)
  4. $idx几乎在每个函数调用中都不同(高基数)

现在我需要知道,如果$arr已经缓存,如果没有,然后创建这个"缓存版本",但也保留所有以前的数组。

根据2.,我不能使用md5(serialize($arr))将其用作标识符,所以我需要另一种方法来确定。您知道如何实现这种高性能缓存功能(假设我无法在此函数之外进行任何更改)吗?

如果不是必须不修改$arr,那么我就直接将您优化的键访问添加到它:

// note the argument has been changed to &$arr - we're passing by reference
function f($idx, &$arr) {
    if (empty($arr['___cached'])) {
        $arr['___cached'] = array();
        foreach ($arr as $k => $v) {
            if ($k === '___cached') continue;
            if (!isset($arr['___cached'][$v['key']])) {
                $arr['___cached'][$v['key']] = array();
            }
            $arr['___cached'][$v['key']][] = $v;
        }
    }
    return $arr['___cached'][$idx];
}