【问题标题】:Caching large arrays缓存大数组
【发布时间】:2014-06-18 19:03:00
【问题描述】:

我有以下功能:

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() 在 1 个请求中被多次调用
  2. $arr 总是很大
  3. $arr 在不同的函数调用中可能会有所不同(低基数)
  4. $idx 几乎在每个函数调用中都不同(高基数)

现在我需要知道,如果$arr 已经被缓存,如果没有,则创建这个“缓存版本”,但还要保留所有以前的数组。

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

【问题讨论】:

  • 那么,您要查找的是$a[$array_identifier][$idx],而不是$a[$idx]

标签: php arrays performance caching


【解决方案1】:

如果$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];
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-07
    • 2013-05-31
    • 2010-11-14
    • 1970-01-01
    • 2011-05-12
    • 1970-01-01
    • 2017-10-19
    • 1970-01-01
    相关资源
    最近更新 更多