對於我的一個項目,我需要導入一個非常大的文本文件(約950MB)。我爲我的項目使用了Symfony2 & Doctrine 2。PHP內存調試
我的問題是,我得到這樣的錯誤:
Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 24 bytes)
的錯誤,即使我增加內存限制爲1GB發生。
我嘗試用了XDebug和KCacheGrind(爲的PHPEdit的一部分)來分析這個問題,但我實在不明白的值:(
我'尋找一種工具或方法(快速& 。簡單歸因於事實,我沒有太多的時間),找出爲什麼內存分配,而不是再次釋放
編輯
要在這裏明確一些事情是我的代碼:
$handle = fopen($geonameBasePath . 'allCountries.txt','r');
$i = 0;
$batchSize = 100;
if($handle) {
while (($buffer = fgets($handle,16384)) !== false) {
if($buffer[0] == '#') //skip comments
continue;
//split parts
$parts = explode("\t",$buffer);
if($parts[6] != 'P')
continue;
if($i%$batchSize == 0) {
echo 'Flush & Clear' . PHP_EOL;
$em->flush();
$em->clear();
}
$entity = $em->getRepository('MyApplicationBundle:City')->findOneByGeonameId($parts[0]);
if($entity !== null) {
$i++;
continue;
}
//create city object
$city = new City();
$city->setGeonameId($parts[0]);
$city->setName($parts[1]);
$city->setInternationalName($parts[2]);
$city->setLatitude($parts[4]);
$city->setLongitude($parts[5]);
$city->setCountry($em->getRepository('MyApplicationBundle:Country')->findOneByIsoCode($parts[8]));
$em->persist($city);
unset($city);
unset($entity);
unset($parts);
unset($buffer);
echo $i . PHP_EOL;
$i++;
}
}
fclose($handle);
事情我都試過了,但沒有任何幫助:
- 添加第二個參數與fgets
- 增加memory_limit的
- 取消設置瓦爾
當我們知道可能有臨時的大內存使用情況(如下載2GB文件等)時,我們曾經爲某些腳本設置內存限制爲20GB。 :) – Vyktor 2012-01-29 16:03:45
這只是瘋了。不是每個人都有20GB的內存。認真... – 2012-01-29 16:50:28
我已經看到了在taskmanager中的php進程,內存使用量不斷上升。我有C++或Objective-C的這個問題,因爲我忘記了_delete_或_release_,但從未使用php – Frido 2012-01-29 19:04:47