2012-03-15 2 views
3

PHPExcel 프레임 워크를 사용하여 mysql 쿼리에서 매우 큰 엑셀 문서를 작성하려고합니다. 나는 페이지가 오류로 플래그되는 경우 (의에 대해이 나) 5000 행 표시를 명중 할 때까지PHPExcel - 청크로 쓰기/추가

모든 것이 잘 작동 : 문서화 나는 이것을 알고

Fatal error: Allowed memory size of xxx bytes exhausted (tried to allocate yyy bytes) in zzz on line aaa 

, 나는이에 메모리 할당을 조정 한 서버하지만 여전히 나는 천장에 부딪치고있다. 포맷팅 기능을 끄려 고했지만 실제로는 필요합니다.

작은 청크로 작성하거나 엑셀 문서에 추가하여 메모리 할당이 고갈되지 않도록하는 방법이 있습니까? 나는 페이지 라인의 라인을 따라 1000 라인을 말하고, 그 다음에 리다이렉트하고 다음 1000 트랙을 GET을 사용하여 처리한다고 생각하고있다. 예를 들어 :

index.php?p=0

는,

index.php?p=1000

리디렉션하지만 모든 일을 열지 않고 기존 문서에 추가 할 수있는 방법을 찾을 수 없습니다.

답변

3

일반적인 실수는 사람들이 mysql 데이터를 배열에로드 한 다음 Excel 셀 데이터를 설정하는 배열을 반복하는 것이기 때문에 청크로 쓰는 방법은 없습니다. mySQL 쿼리 결과 집합을 반복하면서 셀 데이터를 설정하는 것이 더 효율적입니다.

메모리 사용을 최소한으로 유지해야한다면 어떤 셀 캐싱 방법을 사용하고 있습니까? 셀 캐싱은 느리지 만 상당한 양의 메모리를 절약 할 수 있습니다.

+0

캐시! 나는 그걸 정하지도 않았어, 좋은 전화. 빠른 후속 질문, 쓰기가 많은 대용량 문서의 경우 어떤 캐시 방법을 선택합니까? 나는 단지 약 6,000 컬럼의 10,000 개의 행을 처리했지만, 60,000 개의 버그가있는'cache_to_discISAM'을 시도했습니다. 나에게 잘못을주지 마라 10,000는 굉장하고 충분할 것이다 - 그러나 나는 나의 애플 리케이션을 테스트 스트레스를 좋아한다. 수정 -이 경우에 속도에 대해 신경 쓰지 않아요 – Chris

+0

편집 2 - 아파치/리눅스 서버에서 실행 중입니다 (따라서 캐시가 승리합니다). – Chris

+0

현재 모든 프로덕션 릴리스 캐시 방법은 적어도 메모리의 "셀 맵" ", 그래서 (예를 들면) DiskISAM은 phpTemp처럼"메모리에있는 "파일에 셀 참조의 크기와 위치를 가지고 있습니다. 프로덕션 코드에서 가장 효율적인 메모리 캐싱 메커니즘은 memcache, APC 및 WinCache입니다.이 맵은 단순한 "셀이 있음"부울입니다. 최신 버전의 SVN 코드는 SQLite를 캐싱 옵션으로 추가하여 훨씬 더 효율적입니다 ("메모리 내"맵이 전혀 없으며 모든 것이 SQLite 내부에 있음) –