2016-06-08 3 views
0

대형 저장소의 모든 개체를 처리해야하는 TYPO3 CMS 6.2 Extbase에 확장 기능을 작성하고 있습니다. 내 함수는 약 10,000 개의 객체가 있으면 잘 작동하지만 약 20,000 개 이상의 객체가 있으면 메모리가 부족합니다. 더 큰 저장소를 처리하려면 어떻게해야합니까?프로그램이 메모리가 부족하여 대형 TYPO3 Extbase 저장소를 읽음

$importRecordsCount = $this->importRecordRepository->countAll(); 
for ($id = 1; $id <= $importRecordsCount; $id++) { 
    $importRecord = $this->importRecordRepository->findByUid($id); 
    /* Do things to other models based on properties of $importRecord */ 
} 

프로그램은 위의 findByUid() 라인을 통과 한 TYPO3\CMS\Core\Utility\GeneralUtility::instantiateClass()..\GeneralUtility.php:4427 근처에서 메모리를 초과한다. 최신 테스트 중에이 오류가 발생하는 데 117 초가 걸렸습니다. 오류 메시지는 다음과 같습니다

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 4194304 bytes) in ... \typo3\sysext\core\Classes\Utility\GeneralUtility.php on line 4448

을가 중요한 경우에, 나는 때문에 나중에 기능의 수행 처리의 일부 @lazy 사용하지 마십시오.

답변

1

, 대신 128M의 256M 메모리 제한을 권장합니다 그래서 나의 첫 번째 제안은 먼저 그렇게하려고 노력할 것이고 그것은 지금 당신의 문제를 해결할 것입니다. 또한 importRecordRepository-> findAll();을 사용해야합니다. 누군가 uid를 반복하여 각 레코드를 가져 오는 대신 누군가가 일부 레코드를 삭제했을 수 있기 때문입니다.

+0

php.ini의'memory_limit'을 128M에서 256M으로 늘리면 문제가 해결됩니다. 내 개발 환경에서. – Andrew

1

일반적으로 Extbase는 이러한 많은 양의 데이터를 처리하는 데 실제로 적합하지 않습니다. 올바른 기록 등이 필요한 경우 DataHandler을 사용하는 것이 좋습니다. 또한 최상의 성능 접근 방식 인 TYPO3 Database API (DatabaseConnection, $GLOBALS['TYPO3_DB'])를 사용하는 것과 비교할 때 약간의 오버 헤드가 있습니다. this answer에 내 의견 및 자습서를 참조하십시오.

Extbase API를 사용하기로 결정했다면 작동 할 수있는 유일한 방법은 메모리를 비우기 위해 모든 X 항목을 유지하는 것입니다 (설정에서 작동하는 항목을 시도해보십시오). 코드에서 정말있는 당신의 조작이 작동 지적 볼 수 있지만, 예를 들어이 걸릴 : Source

공식 TYPO3 웹 사이트에 따르면

$importRecords = $this->importRecordRepository->findAll(); 
$i = 0; 
foreach ($importRecords as $importRecord) { 
    /** @var \My\Package\Domain\Model\ImportRecord $importRecord */ 
    // Manipulate record 
    $importRecord->setFoo('Test'); 
    $this->importRecordRepository->update($importRecord); 

    if ($i % 100 === 0) { 
     // Persist after each 100 items 
     $this->persistenceManager->persistAll(); 
    } 

    $i++; 
} 
// Persist the rest 
$this->persistenceManager->persistAll(); 
+0

$ importRecord의 데이터에서 다른 모델을 조작하는 지점을 표시하기 위해 제 질문을 편집했습니다. – Andrew

+0

이 사례가 Extbase API를 유지하고 반복 된 지속 기술을 사용하기로 결정했습니다. 이 문제는 해결되었지만 php.ini 파일을 수정하여'memory_limit'을 128M에서 256M로 늘리고'max_execution_time'을 240에서 960으로 늘리십시오. – Andrew

관련 문제