0

我正在尝试使用 CakePHP 2.1 的方法保存超过 10000 条记录的列表,saveMany(). 但它给了我一个 500 错误,或者一个“内存耗尽”的致命错误。

如果我在处理完整个数组后对其进行调试(因此,不调用 save 方法),时间在 0.05 秒以下。但是当我添加保存方法 ( $this->saveMany($save, array('validate' => false));) 时,它向我显示了上述错误之一。

我提到我使用 InnoDB 作为 MySQL 中的存储引擎,使用 PHP 作为脚本语言。

我做错了什么,我该如何解决?

编辑

我回到这个问题,因为我“解决了”为什么没有保存大量记录。原因是……好吧,甚至一条记录都没有保存。我测试了只保存生成的数组中的第一个元素,这就是它发生的情况:它增加内存直到限制,然后它死了。我已经把它放在我的本地主机上,有 2GB 的内存,它仍然给我超出内存的错误。这很奇怪,我不明白为什么会这样。应用于另一个模型的相同代码按预期工作。我重新创建了模型及其表,但没有成功。我能想到的唯一原因是表名的长度,但这对我来说毫无意义。仅仅为了保存一条记录,什么会导致内存增加?

4

1 回答 1

2

保存 10000 行可能需要一段时间。确保您已将 php 的时间限制设置set_time_limit(120);得足够大。

您也可以尝试像这样一一保存记录:

foreach($save as $s){

    $this->create();
    $this->save($s, array('validate' => false));

}

编辑1:

但是,如果原始数据来自数据库,您可以使用 MySQL 控制台或使用直接将其复制到缓存表中$this->query();

或者你可以SELECT把它INTO OUTFILELOAD DATA INFILE它放到缓存表中。

编辑2:

然后我想到的唯一一件事就是将数据保存到磁盘上的文本文件中,然后在另一个函数中读取它,并在时间/内存限制允许的时间将其保存为尽可能多的行。您也可以尝试将其保存在 csv 文件中并使用$this->query('LOAD DATA LOCAL INFILE xxx ...');

我只是想到你应该在保存之前禁用索引以使它们更快。您可以使用$this->query('ALTER TABLE table DISABLE KEYS;');

于 2012-03-04T14:21:33.550 回答