3

好的,所以我有一个网络系统(基于 codeigniter 并在 mysql 上运行),它允许人们通过在一系列表单中进行选择来查询邮政地址数据的数据库,直到他们到达想要的选择,非常标准的东西. 然后他们可以购买该信息并通过该系统下载。

查询运行得非常快,但是在将查询应用到数据库并将其导出到 csv 时,一旦数据集达到 30,000 条记录标记(每行大约有 40 列,其中大约 20 列全部填充每个单元格平均 20 个字符的数据)导出到 csv 可能需要 5 分钟左右。

所以,我的问题是,缓慢的主要原因是什么?是不是查询的数据结果集太大了,以至于遇到了内存问题?因此,我应该为该过程留出更多内存吗?或者,有没有更有效的方法从我没有做的 mysql 查询导出到 csv?我应该将查询的内容保存到临时表并简单地将临时表导出到 csv 吗?还是我要解决这一切都错了?此外,由于它存储结果集的方式,我正在使用 Codeigniters Active Record 进行这种禁止吗?

伪代码:

$query = $this->db->select('field1, field2, field3')->where_in('field1',$values_array)->get('tablename');
$data = $this->dbutil->csv_from_result($download_query, $delimiter, $newline); // the some code to save the file
$this->load->helper('download');
force_download($filename, $filedata);

欢迎任何建议!感谢您的阅读!

4

2 回答 2

1

暂时忽略 Codeigniter,您基本上有三个使用 PHP 导出 CSV 的选项:

  • 到磁盘 - 通常是最慢的选项
  • 记忆 - 通常是最快的选择
  • 直接进入浏览器

在您的情况下,我会跳过任何内置的 Codeigniter CSV 函数并尝试直接流式传输到浏览器(完整示例请参见上面的链接)。

于 2012-10-30T14:33:26.913 回答
0

30,000 条记录 * 40 列 * 20 字节 = 24,000,000 字节

如果这是一个繁忙的共享服务器,那么我可以想象这是一个磁盘 I/O 瓶颈。如果它是基于 Windows 的服务器,那么可能还会发生一些分页以减慢它的速度。

尝试跳过磁盘并直接写入网络。

于 2012-10-23T16:57:32.707 回答