使用CakePHP的saveMany()保存> 10000条记录

时间:2012-03-04 12:05:34

标签: php cakephp innodb save cakephp-2.1

我试图用CakePHP 2.1的方法saveMany()保存超过10000条记录的列表。但它给了我一个500错误,或'内存耗尽'致命错误。

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

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

我做错了什么,如何解决这个问题?

修改

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

1 个答案:

答案 0 :(得分:2)

保存10000行可能需要一段时间。确保你已经设置了php的时间限制set_time_limit(120);

您也可以尝试逐个保存记录:

foreach($save as $s){

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

}

编辑1:

但是如果原始数据来自数据库,您可以使用MySQL控制台或使用$this->query();

将其直接复制到缓存表

或者你可以SELECTINTO OUTFILELOAD DATA INFILE可以到缓存表。

编辑2:

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

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

来完成此操作