2013-12-19 48 views
2

我有一个报告,我必须编写代码才能运行,它必须将一个月的数据编译成一个CSV文件。数据接近112,000行,每行有47个数据单元。CSV文件创建时内存不足

当我尝试写入文件时,内存不足。我认为fflush可能会这样做,但它似乎并没有。该代码是在PHP中。

$filename = str_replace(array('-',':','_', ' '), '', "export_" . date("m-d-Y H:i:s") . ".csv"); 
header('Content-Type: text/csv'); 
header("Content-Disposition: attachment; filename='$filename'"); 
header('Pragma: no-cache'); 
header('Expires: 0'); 
$con=mysqli_connect("localhost","root","changedForSecurity","reports"); 
// Check connection 
if (mysqli_connect_errno()) 
    { 
    echo "Failed to connect to MySQL: " . mysqli_connect_error(); 
    } 

$result = mysqli_query($con,"SELECT * FROM testing"); 
$row = mysqli_fetch_array($result, MYSQLI_ASSOC); 
$fp = fopen($filename, 'w'); 
$i=1; 
while($row = mysqli_fetch_array($result)) { 

    if ($i < 15000) { 
     fputcsv($fp, $row); 
     $i++; 
    } else { 
     fflush($fp); 
     $i=1; 
     fputcsv($fp, $row); 
    } 

} 
+0

在你的php.ini中升级你的内存限制 –

+2

我没有看到这个脚本可能会耗尽内存。内存中的数据库永远不会有多行。你不需要调用'fflush()',PHP会在填满时自动刷新缓冲区。脚本的其他部分必须导致问题,而不是您发布的部分。 – Barmar

+0

写入文件之后,脚本的另一部分是下载它的吗?我怀疑内存问题在那里。 – Barmar

回答

0

您将不得不更改内存限制设置。这可以通过手动改变其在php.ini文件,也可以在代码中做到这一点:

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

还是在.htaccess文件:

php_value memory_limit 256M 

有一点要注意的是,你应该尝试限制您在此设置的金额。如果您的设置为64M,请先尝试128M。或者,如果它设置为128M,则尝试256M。如果没有必要,将它设得太高就太矫枉过正了。

您可以检查你正在做这个使用多少内存:

$initMemory = memory_get_usage(); 
// your code 
$afterMemory = memory_get_usage() - $initMemory; 
echo $afterMemory; 
exit; 
0

除了增加你的内存限制在ini,你也可以只拆分的文件。几乎没有优雅,但它在一个捏。