0

我们有一个流程设置为每天凌晨 1 点作为批处理作业运行,以执行我们需要的一些计算,以便向我们的用户发送更新通知。

我们收到这条消息,内核每次都在杀死进程:

4 月 8 日 01:06:51 玛莎内核:[14697876.360797] 内存不足:杀死进程 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 对象或类似对象。

我对如何解决这个问题的两个想法是:

  1. 了解如何允许 cron 作业使用更多内存
  2. 将 XML 文件分阶段读入文件,并让 SAX 解析器从文件中解析,而不是将完整的 40-670MB XML 字符串保存在内存中。

如果有人对如何解决此问题有任何想法,我将不胜感激。

4

1 回答 1

2

可能只是 PHP 限制了脚本允许使用的内存量:

为了增加内存使用,命令ini_set()应该可以帮助您。这是一篇关于使用它来增加php 脚本的内存限制的文章。

于 2013-04-22T12:51:37.887 回答