2012-03-04 5 views
8

file_get_contents를 사용하여 디스크에서 XML 파일을로드하고 있으며, file_get_contents()을 사용하여 156K 파일을로드 할 수있는 테스트를 3.99 초 만에 완료했습니다. 로딩을 수행하고 memcache 레이어로 대체 한 부분을 서브 클래 싱했습니다. 그리고 내 dev 머신에서 4.54 초 만에 같은 문서를 1000 번로드 할 수 있습니다.왜 file_get_contents가 memcache_get보다 빠릅니까?

file_get_contents()가 일부 캐싱을 수행하지만 실제로는 잘 알려진 캐싱 기술보다 빠른 것 같습니다. 단일 서버에서 성능이 file_get_contents()만큼 좋을까요?

Macports, OS X 10.6.8을 통해 PHP 5.2.17을 사용 중입니다.

편집 :이 크기의 XML 문서에서 발견 한 바에 따르면 MEMCACHE_COMPRESSED 플래그를 사용할 때 얻을 수있는 작은 이점이 있습니다. memcache를 통한 1,500로드는 6.74 초 (압축 없음)가 아닌 6.44 초 (완료)로 수행됩니다. 그러나 둘 다 file_get_contents보다 느리며, 5.71 초 동안 같은 수의로드를 수행합니다.

답변

8

file_get_contents mmap 파일이므로 파일 시스템 호출이 몇 개 밖에 없으므로 파일 시스템 캐시에 저장됩니다. memcache는 memcached (및 클러스터 된 구현의 서버 외부)에 대한 out-of-process 호출을 포함합니다.

file_get_contents()의 성능은 파일 시스템의 유형에 따라 결정됩니다. 예를 들어 NFS 마운트 파일 시스템의 파일은 mmapped가 아니며이 액세스는 느려질 수 있습니다. 또한 다중 사용자 서버에서 파일 시스템 캐시는 다른 프로세스에 의해 빠르게 플러시 될 수 있지만 memcached 캐시는 거의 확실하게 메모리에 저장됩니다.

+0

아, 재미 있습니다. 여러 XML 파일이 항상로드되는 웹 서버에서 Memcache 방식의 성능이 _ 경우에 따라 더 좋을 수도 있습니다. (아마도 저가형 Linux VPS에, 아마도 512MB의 RAM을 탑재 할 것으로 예상됩니다. memcache가 기본적으로 예약하는 기본 64M은 무료입니다.) – halfer

+0

여전히 FS 캐시에서 뭔가를 노크하는 논쟁이 memcache 캐시에서 뭔가를 노크 할 가능성이 있을지 궁금합니다. ';-)' – halfer

+0

하나의 응용 프로그램에 전용 인 VPS에서는 다음을 수행 할 수 있어야합니다. 적합하게 모든 것을 얻으십시오. 그러나 캐시의 "크기 조정"에 가치가있는 것 : memcache에 32M을 사용하거나 그 이상이면 충분합니다. 앱이 PHP 기반 인 경우 APC 또는 Xcache를 사용해야합니다. MySQL을 사용하면 MySQL 캐시를 조정하여 좋은 성능 배당을 얻을 수 있다는 것을 잊지 마십시오. 512MB는 충분히 작아서 현명하게 할당해야합니다. – TerryE

3

file_get_contents는 파일을 검색하는 가장 간단한 방법입니다. 기본 운영체제 (특히 리눅스)는 이미 효율적인 캐싱 메커니즘을 가지고 있습니다. 당신이하는 일 외에는 오버 헤드가 생기고 일이 느려집니다.

Memcache는 원격 위치에서이 파일을로드하면 의미가 있습니다.

편집 : file_get_contents가 가장 간단한 방법 일 필요는 없습니다. fopen/fget 이 더 빠를 수도 있습니다. 잘 모르겠습니다. 그러나 차이점은 캐싱 계층의 복잡성과 비교할 때 미미해야합니다.

+0

나는 네가 옳다고 생각한다. 나는'file_get_contents'가 매회 (아마도 파일이 변경되었는지 확인하기 위해) _some_ 디스크 활동을 수행하는 것을 기대하고 있었지만,'memcache_get'는 아무 것도 할 필요가 없다고 생각했습니다. 따라서 memcache 접근법이 더 빠를 것이라는 나의 기대는 ... 그럼에도 불구하고 나는 무언가를 배웠다고 생각하기 때문에 시간 낭비가되지 않았다. :) – halfer

+0

매우 일반적인 수준에서 FS 캐시는 PHP와 동일한 기능을 수행한다. memcache - 훨씬 더 전문화되어 있으며 스크립팅 언어로 작성되지 않았습니다. :) 파일 내용이 변경되지 않는 한 캐시는 파일에 다시 액세스 할 필요가 없습니다. 파일 캐시를 플러시하는 시스템에 많은 IO 작업이있는 경우 별도의 캐싱 메커니즘이 적합합니다. – Someone

+0

@TerryE에 대한 진드기, Mantriur에 대한 +1은 모두 도움이됩니다. 고맙습니다. – halfer

1

Memcache에 XML 파일을 저장하는 것은 나에게 거의 의미가 없습니다.

필자는 파싱 된 값을 저장하여 읽기와 구문 분석을 모두 절약 할 수 있습니다.

+0

실제로 그것은 원래 의도였습니다. SimpleXML 객체를 직렬화 할 수 없다는 사실이 밝혀지기 전까지는. 명백하게 그들은 리소스를 포함하고 있습니다. 물론 직렬화 된 형태로 적절히 표현 될 수는 없습니다. – halfer

+0

리소스를 원하십니까? 어떤 자원? –

+0

자료 : [이 답변] (http://stackoverflow.com/a/5264628/472495)을 참조하십시오. – halfer

관련 문제