2

我正在测试一个 php 脚本来创建包含大量数据的 csv 文件。这是我执行此任务的方式:

$csvdata = "ID,FN,LN,ADDR,TEL,PRO\n
            1,fn1,ln1,addr1,tel1,pro1\n...etc,";
$fname = "./temp/filename.csv";
$fp = fopen($fname,'w');
fwrite($fp,$csvdata);
fclose($fp);

我注意到当字符串 ($csvdata) 包含大约 100,000 个数据行时,脚本可以正常工作。但是当它获得超过 10,00,000 个数据行时,它会停在我构建字符串 $csvdata 的中间(我通过在 for 循环中连接数据来构建 $csvdata 字符串,数据来自数据库)。

当我们使用大字符串值时,有人可以告诉我出了什么问题吗?

谢谢 亲切的问候

4

3 回答 3

5

我通过在 for 循环中连接数据、来自数据库的数据来构建 $csvdata 字符串。

据此,我了解到您正在准备将整个文件写入字符串并最终将其写入文件。

如果是这样,那么这种方法并不好。请记住,字符串存在于主内存中,每次追加时,都会消耗更多内存。解决此问题的方法是逐行写入从数据库中读取记录的文件,转换/格式化(如果需要),准备 CSV 行并将其写入文件。

于 2012-05-09T07:19:16.413 回答
1

查看您的错误日志。它可能会说一些关于

  1. 您试图分配超过某个最大值的内存。这意味着您使用了太多内存 -> 您可以更改 php 允许使用的内存量(php.ini 中的内存限制)

  2. 执行时间长于允许的时间。同样,您可以增加这个时间。

于 2012-05-09T07:19:55.230 回答
1

它应该$csvdata=在您的脚本可能会Memory Exhausted出错的部分。

当您将 10 个字符保存到您的 a 变量时,它需要 10 位,并且它会越来越大。限制是当它到达分配的内存或 php.ini 时。

所以这就是你继续前进的方式:

  1. 设置内存限制 - 增加你的 PHP 内存限制

`ini_set('memory_limit', '256M');

2.逐行写

立即将每条数据写入文件,而不是将它们堆积起来。另外,如果您将 array[0] 写入文件,然后将下一条数据存储到 array[1] 并再次写入并继续执行此操作,则与您现在所做的效果相同。

所以要么

while(blah blah){
$var = "text";
fwrite($file,$var);

或在 for 循环中

for($i=0;blahblah){
$var[$i] = "query";
fwrite($file,$var[$i]);
unset($var);

当数据库查询是有条件的时,for循环会派上用场WHERE id='$i'

祝你好运。

于 2012-05-09T07:33:49.153 回答