2014-06-18 2 views
0

:캐싱 큰 배열

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))을 식별자로 사용할 수 없으므로이를 확인하기 위해 다른 방법이 필요합니다. 그러한 hight-performance 캐싱 기능을 어떻게 달성 할 수 있는지 알고 싶습니다 (이 함수 밖에서 어떤 변경도 할 수 없다고 가정 해 봅시다)?

+0

, 대신에 [$ IDX]', 당신은 $있어'의 '$ a [$ array_identifier] [$ idx]'를 찾으십니까? – Jason

+0

네, 맞아요 :) –

답변

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]; 
}