PHP 스프레드시트로 매우 큰 스프레드시트 구축
저는 PHP 스프레드시트가 대형 엑셀 스프레드시트에서 어떻게 작동하는지 테스트하고 있습니다.초기 테스트에서는 큰 스프레드시트의 경우 메모리가 빠르게 부족하다는 것을 나타냅니다.
스프레드시트를 점진적으로 작성할 수 있는 방법이 있습니까?
저는 PHP에서 스프레드시트를 만들기 위해 오랫동안 사용해온 오래된 코드를 가지고 있습니다.이것은 매우 오래된 표준을 사용하며 업데이트 예정입니다.그러나 이전 코드의 한 가지 장점은 전체를 메모리에 구축하는 대신 파일에 기록할 수 있다는 것입니다. 따라서 메모리 제한을 풀지 않고도 매우 큰 스프레드시트를 쉽게 처리할 수 있습니다.
PHP 스프레드시트에서 유사한 작업을 수행할 수 있습니까?설명서를 읽어보고 다양한 포럼을 검색해봤지만 대부분의 응답은 "사용 가능한 메모리를 늘린다"는 것 같습니다.
안타깝게도 PHPExcel 및 PHP 스프레드시트는 대용량 파일에 적합하지 않습니다.
옵션은 매우 제한적입니다.
- 메모리 제한을 계속 늘림
- 데이터를 별도의 스프레드시트로 청크
- CSV로 폴백(PHP의 내장 함수 사용)
Marten의 캐시 제안은 좋은 생각이지만, 제 경험으로는 메모리의 이점을 완전히 부정하는 엄청난 속도 비용이 수반되었습니다.
제 제안은 PHPS 스프레드시트를 완전히 버리고 박스/스푸트를 시도하는 것입니다.
성능을 고려하여 구축되었으며 파일 크기에 상관없이 3MB 미만의 메모리를 사용할 수 있습니다!메모리 효율적일 뿐만 아니라 PHP 스프레드시트보다 약 20-30배 더 빨랐습니다.
지원되는 파일 형식이 3개뿐이고, 열 너비가 자동으로 설정되지 않으며, 열 번호/문자열 형식이 지정되지 않음) 몇 가지 제한 사항이 있지만, 누락된 기능 중 일부는 계획된 것이라고 생각합니다. 현재로서는 대량의 스프레드시트를 작성하는 데 가장 적합한 옵션이었습니다.
참고: 버전 3의 성능 문제가 해결될 때까지 버전 2.7을 유지하는 것이 좋습니다.
시도하지 않은 다른 옵션은 PHP_XLSXWriter입니다.스파우트와 비슷한 목표를 가지고 있는 것 같습니다.
문서에는 다음과 같은 항목이 포함되어 있습니다.
https://phpspreadsheet.readthedocs.io/en/latest/topics/memory_saving/ #메모리 절약
기본적으로 셀을 캐시에 저장할 수 있습니다. 예를 들어 Redis(문서에서)의 경우 다음과 같습니다.
$client = new \Redis();
$client->connect('127.0.0.1', 6379);
$pool = new \Cache\Adapter\Redis\RedisCachePool($client);
$simpleCache = new \Cache\Bridge\SimpleCache\SimpleCacheBridge($pool);
\PhpOffice\PhpSpreadsheet\Settings::setCache($simpleCache);
Predis를 사용하는 경우 다음 리포지토리를 사용할 수 있습니다.
https://github.com/php-cache/predis-adapter
다음 코드를 사용합니다.
$client = new \Predis\Client($yourParameters, $yourOptions);
$pool = new \Cache\Adapter\Predis\PredisCachePool($client);
$simpleCache = new \Cache\Bridge\SimpleCache\SimpleCacheBridge($pool);
\PhpOffice\PhpSpreadsheet\Settings::setCache($simpleCache);
tl;dr: 2022년 8월 기준 권장 사항: 오픈스팟은 여러분의 도전에 적합한 선택일 수 있습니다.저에게는 완벽하게 작동했습니다.
그 이유에 대한 약간의 설명:
저는 또한 PHP 스프레드시트의 메모리 문제에 부딪혔고 몇 년 전에 이 질문을 발견했습니다.편리한 삶을 위한 방법:
Pphp 스프레드시트에 다른 캐시를 사용하는 것은 너무 느린 것 같습니다. Jason Klein은 Pphp 스프레드시트에 대해 서로 다른 캐시 옵션을 분석했지만 어떤 것도 실제로 큰 시트에 유용한 성능을 제공하지 않았습니다. (그리고 큰 시트가 이 게시물을 읽는 이유입니다, 그렇죠?)
PHP 스프레드시트의 아키텍처는 셀에 대한 메모리 내 액세스에 크게 의존합니다.캐싱을 위한 모든 파일 또는 네트워크 트래픽은 성능에 큰 영향을 미칩니다.
box/messages가 더 이상 활성화되지 않습니다. 하지만 다음과 같은 후속 항목이 있습니다.박스/스푸트의 포크이며 현재 활발히 유지되고 있는 오픈스포트입니다.이것은 현재 PHP를 통해 대용량 엑셀 파일을 위한 필수 옵션인 것 같습니다.
다른 방법은 https://packagist.org/packages/avadim/fast-excel-writer 입니다.
XLSX 파일(XLS가 아님)만 지원하지만 Pphp 스프레드시트보다 7-9배 더 빠르며 자동 열 너비와 열/셀 형식으로 메모리를 훨씬 적게 사용합니다.이 라이브러리를 사용하여 10K 행의 대용량 XLSX 파일을 생성합니다.
언급URL : https://stackoverflow.com/questions/50731704/building-very-large-spreadsheet-with-phpspreadsheet
'programing' 카테고리의 다른 글
목표-C: id와 void의 차이 * (0) | 2023.05.06 |
---|---|
Windows용 ActivePerl 또는 StrawberryPerl 중 어느 것을 선택해야 합니까? (0) | 2023.05.06 |
고유 사용자 ID의 시퀀스를 저장하기 위한 MongoDB의 자동 증분 (0) | 2023.05.06 |
ASP의 컨트롤러에서 이진 파일을 반환하는 중입니다.NET 웹 API (0) | 2023.05.06 |
비주얼 스튜디오에서 이클립스의 Ctrl+클릭? (0) | 2023.05.06 |