使用CakePHP的saveMany保存> 10000条记录()
我试图用CakePHP 2.1的方法saveMany()
保存超过10000条记录的列表。但它给了我一个500错误,或者一个“内存耗尽”的致命错误。使用CakePHP的saveMany保存> 10000条记录()
如果我在处理完整个数组后调试整个数组(所以,没有调用save方法),时间小于0.05s。但是,当我添加保存方法($this->saveMany($save, array('validate' => false));
)时,它会显示我上面的错误之一。
我提到我在MySQL和PHP中使用InnoDB作为我的存储引擎作为脚本语言。
我在做什么错,我该如何解决这个问题?
编辑
我回来这个问题,因为我“解决”为什么那庞大的记录数不保存。原因是......好,甚至没有一条记录被保存。我测试过只保存生成数组中的第一个元素,这就是它发生的情况:它会增加内存直到极限,然后死亡。我把它放在2GB内存的本地主机上,它仍然给我超过内存的错误。这很奇怪,我不明白为什么会发生这种情况。在另一个模型上应用的相同代码按预期工作。我重新创建了模型和它的表格,但没有成功。我能想到的唯一原因是表名的长度,但对我来说没有意义。为了保存单个记录,什么会产生这种内存增加?
保存10000行可能需要一段时间。确保你已经设置了php的时间限制set_time_limit(120);
够大。
您也可以尝试通过一个像这样一个保存记录:
foreach($save as $s){
$this->create();
$this->save($s, array('validate' => false));
}
编辑1:
但是如果原始数据从数据库中来,你可以直接把它复制到缓存表MySQL的控制台或使用$this->query();
或者你可以SELECT
它INTO OUTFILE
和它的LOAD DATA INFILE
到缓存表。
编辑2:
那么只有一件事情在我脑海中是在时间将数据保存到文本文件,在磁盘和另一个函数读取并保存它作为许多行的时间/内存限制允许。您也可以尝试将其保存在csv文件上并使用$this->query('LOAD DATA LOCAL INFILE xxx ...');
我想到,在保存之前应该禁用索引以使其更快。你可以通过使用$this->query('ALTER TABLE table DISABLE KEYS;');
你需要多久做一次? 10000条记录来自哪里?您需要提供更多信息,以便人们可以建议其他方法。 – Henri 2012-03-04 14:39:27
我正在为我的应用程序构建一个缓存,以便每当我需要检索并计算一些数据时,我只需从这些10000中获取几条记录。我只需手动执行几次。所以脚本的唯一要求是实际工作。 – linkyndy 2012-03-04 14:43:31
更新了我的答案。你有没有访问MySQL控制台? – Henri 2012-03-04 15:04:11