2012-03-04 39 views
0

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

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

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

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

编辑

我回来这个问题,因为我“解决”为什么那庞大的记录数不保存。原因是......好,甚至没有一条记录被保存。我测试过只保存生成数组中的第一个元素,这就是它发生的情况:它会增加内存直到极限,然后死亡。我把它放在2GB内存的本地主机上,它仍然给我超过内存的错误。这很奇怪,我不明白为什么会发生这种情况。在另一个模型上应用的相同代码按预期工作。我重新创建了模型和它的表格,但没有成功。我能想到的唯一原因是表名的长度,但对我来说没有意义。为了保存单个记录,什么会产生这种内存增加?

+0

你需要多久做一次? 10000条记录来自哪里?您需要提供更多信息,以便人们可以建议其他方法。 – Henri 2012-03-04 14:39:27

+0

我正在为我的应用程序构建一个缓存,以便每当我需要检索并计算一些数据时,我只需从这些10000中获取几条记录。我只需手动执行几次。所以脚本的唯一要求是实际工作。 – linkyndy 2012-03-04 14:43:31

+0

更新了我的答案。你有没有访问MySQL控制台? – Henri 2012-03-04 15:04:11

回答

2

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

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

foreach($save as $s){ 

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

} 

编辑1:

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

或者你可以SELECTINTO OUTFILE和它的LOAD DATA INFILE到缓存表。

编辑2:

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

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

+0

它仍然没有达到目的。它再次发布超过内存的错误。我无法更改内存/时间限制,因为我在付费主机上。 – linkyndy 2012-03-04 14:27:18

+0

我没有访问控制台,我真的不能复制它,因为我需要对我的表中的数据执行一些操作。只有在数据修改为缓存后才能保存。 – linkyndy 2012-03-04 15:19:17

+0

@linkyndy检查出更新的答案... – Henri 2012-03-04 15:33:49