【发布时间】:2016-07-19 10:02:41
【问题描述】:
我有 100 万行的 MySQL InnoDB 表,我选择了 100K 行进行导出。表格大约有 200 列。
到目前为止我做了什么:
-
不是用*全选
SELECT column1, column2, ... FROM my_table WHERE deleted=0 -- 加载 100k 条记录
-
使用带有flush的XMLWriter php库
$writer = new XMLWriter(); $writer->openMemory(); $writer->setIndent(true); $writer->startDocument('1.0', 'UTF-8'); $writer->startElement('export'); $iterator = 0; $data = $this->getData(); foreach($adverts as $advert) { $writer->startElement('ad'); $writer->writeElement('id', $data->id); // .. other columns $writer->endElement(); // end ad if (0 == $iterator % 1000) { file_put_contents($this->getFilePath(), $writer->flush(TRUE), FILE_APPEND); } $iterator++; }
但我仍然有致命错误:允许的内存大小为 ... 字节耗尽
还有其他方法可以优化吗?我想我也许可以通过其他方式从数据库加载数据,比如在第一轮只加载 ids,然后选择 IN (10k_ids),但我还没有测试这个想法。
感谢您的意见。
我的问题与How to export HTML table with 100K records with number formatting without memory exhaust中的问题非常相似
但是没有办法实现低内存消耗。
【问题讨论】:
-
人们还在使用 XML? ;-)
-
写几个文件,每个10k?
-
必须是一个文件。我的想法是从数据库中使用 foreach 加载 10k,因此在变量中保存了较小的数据
-
@ManicDepression 效果如何?
-
我加载了我的问题中的所有数据。现在我用函数 getData() 只加载部分数据。限制设置为 10 000 条记录,所以我没有像以前那样庞大的数据,大约 120 000 条记录。我还需要 ORDER BY 以升序对项目进行排序,所以我可以使用 $id > $lastId from last cycle。