对于我的一个项目,我需要导入一个非常大的文本文件(约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