캐싱은 CPU 레벨 작업에서 데이터베이스 인터페이스에 이르기까지 처리를 극적으로 가속화합니다. 캐시 된 데이터를 제거 할 때 결정되는 캐시 무효화는 복잡한 과제입니다. 이 게시물은 단순하면서도 교활한 캐싱 문제를 해결합니다
18 개월 동안 숨어있는이 문제는 사용자가 권장되는 사용 패턴에서 벗어난 경우에만 표면적입니다. 이 문제는 내 조직 내에서 ML (Custom Machine Learning) 프레임 워크 (Scikit-Learn에 구축)에서 비롯되었습니다. 이 프레임 워크는 여러 데이터 소스에 자주 액세스하여 성능 및 비용 최적화 (BigQuery Egress 비용 절감)를 위해 캐싱 레이어가 필요합니다.
처음에는
가 사용되었지만 개발 중에 자주 액세스하는 정적 데이터에는 지속적인 캐시가 필요했습니다. SQLITE를 사용하는 Python 라이브러리 인
는 32- 프로세스 환경 및 Pandas Dataframes (최대 500MB)와의 단순성과 호환성을 위해 선택되었습니다. 메모리 내 액세스를 위해 레이어가 상단에 추가되었습니다.
더 많은 사용자가 프레임 워크를 실험함에 따라 문제가 발생했습니다. 무작위로 잘못된 결과가보고되었으며 일관되게 재현하기가 어렵습니다. 근본 원인 : 캐시 된 팬더 데이터 프레임의 내 위치 수정
우리의 코딩 표준은 처리 후 새로운 데이터 프레임 생성을 지시했습니다. 그러나 일부 사용자는 습관이없는 를 사용하여 캐시 된 물체를 직접 수정했습니다. 이것은 즉각적인 결과를 변경했을뿐만 아니라 캐시 된 데이터를 손상시켜 후속 요청에 영향을 미쳤습니다. .
를 설명하려면, 사전을 사용 하여이 단순화 된 예제를 고려하십시오 :
는 사본이 아닌 참조를 제공합니다. 를 수정하면 캐시 된 데이터가 변경됩니다
솔루션 :
솔루션은 캐시 된 물체의 깊은 사본을 반환하는 것과 관련이 있습니다.
이것은 작은 오버 헤드 (데이터 복제)를 추가하지만 데이터 손상을 방지합니다.
키 테이크 아웃 : lru_cache
DiskCache
lru_cache
의 참조 행동에 대한 더 깊은 이해
코딩 표준을 준수하면 버그가 최소화됩니다
구현의 모범 사례에서 사용자 편차를 계정합니다. 견고성은 종종 우아함을 능가합니다.
위 내용은 파이썬 캐싱 돌연변이 값의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!