2016-06-08 84 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()線,上述後超過近..\GeneralUtility.php:4427存儲器中TYPO3\CMS\Core\Utility\GeneralUtility::instantiateClass()。在我最近的測試中,花了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

據官方TYPO3網站,建議256M內存的限制,而不是128M: Source

所以我的第一個建議就是先嚐試做到這一點,現在可以解決您的問題。你也應該使用importRecordRepository-> findAll();而不是通過迭代uid獲取每條記錄,因爲有人可能刪除了一些記錄。

+0

將php.ini memory_limit從128M增加到256M解決了這個問題,在我的開發環境中。 – Andrew

1

一般來說,Extbase並不適合處理如此大量的數據。如果需要正確的歷史記錄等,另一種方法是使用DataHandler。與使用TYPO3數據庫API(DatabaseConnection,$GLOBALS['TYPO3_DB'])相比,它也具有相當的開銷,這將是最佳性能方法。請參閱我的意見和教程this answer

如果您決定留在Extbase API中,唯一可行的方法是堅持每個X項目(嘗試在您的設置中起作用)以釋放一些內存。從你的代碼,我實在看不出在這一點你操控的作品,但它作爲一個例子:

$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