我有一个非常大的.csv文件,我正在从mysql查询中写入行。我无法直接导出,因为我必须处理每一行,但这不是什么大问题。问题是当我在文件上调用fwrite()时出现内存不足异常:
Allowed memory size of 1572864000 bytes exhausted (tried to allocate 2262361 bytes)
直到有问题的文件达到700MB左右才会发生这种情况。失败的代码是循环的,如下所示:
$file=fopen(export_path."/".$filename, "a");
fwrite($file, implode("\n", $output)."\n");
fclose($file);
其中output []最多5,000行。我曾经把文件保持打开状态,直到完成所有的写作,但想到可能让文件句柄打开可能会占用很多内存,但没有骰子。有什么策略可以通过php附加到非常大的文件?
我看了What is the best way to write a large file to disk in PHP?,但我仍然遇到内存不足的异常。有没有办法在PHP中写入大文件而不必将文件加载到内存中?
答案 0 :(得分:0)
这里的问题可能与您尝试存储在数组中的数据量有关,因此解决此问题的方法实际上是在处理数据库记录时将行写入文件,而不是累积数组中的大量数据,然后在末尾使用implode()
将单个转储中的所有数据写入文件。
<?php
/* $aRecords contains the database records as returned from your SQL query ($output) */
if (count($aRecords) > 0) {
$hFile = fopen('output.txt', 'a') or die('Unable to open file with writable permission');
foreach ($aRecords as &$aRecord) {
/* Do your processing here, assign the data to $sLine instead of adding an element to
an array such as $aRecords[] = 'data'; or $output[] = 'data'; */
$sLine = $aRecord['whatever'] . $aRecord['from'] . $aRecord['your'] . $aRecord['data'];
fwrite($hFile, $sLine . "\n");
}
fclose($hFile);
}