我们有一个进程,设置在每天凌晨1点作为批处理作业运行,以执行一些我们需要的计算,以便向用户发送更新通知。
每次内核终止进程时,我们都会得到这样的消息:
Apr 8 01:06:51 martha kernel: [14697876.360797] Out of memory: Kill处理20803 (processDirector)得分347或牺牲孩子
操作系统(Ubuntu)似乎将内存转储到磁盘。该转储的内容是我们从S3读取的一个大XML文件。
奇怪的是,如果我只是在命令行中以。/processDirector的身份运行脚本,那么它确实执行成功了。
我们抓取的XML文件通常在40-70MB左右。我们使用Amazon S3 SDK2获取XML文件的代码如下:
$result = $s3->getObject(array(
'Bucket' => 'updates-uk',
'Key' => $key,
));
$body = $result->get('Body');
$body->rewind();
return $body->read($result['ContentLength']);
我想知道的是,如果这是一个问题与cron的配置,只允许一个进程使用一定数量的内存。
我使用PHP SAX XML解析器是为了提高速度,防止程序需要构建一个完整的SimpleXML对象或类似的东西。
关于如何解决这个问题,我有两个想法:
- 了解如何允许cron作业使用更多内存
- 将XML文件分阶段读入文件,并让SAX解析器从文件中解析,而不是在内存中保存完整的40-670MB XML字符串。
如果有人有任何想法如何解决这个问题,我将非常感谢。
可能只是PHP限制了脚本允许使用的内存大小:
要增加内存使用,命令ini_set()应该可以帮助您。下面是一篇关于使用它来增加php脚本内存限制的文章。