我有一个大的csv文件(大约30M),我想用我的php程序读取并将其转换为另一种格式并将其保存为不同的小文件。当我使用传统的fopen,fwrite方法时,我收到的错误是Fatal error: Allowed memory size of 134217728 bytes exhausted
。我知道我可以在php.ini中设置内存限制,但有没有办法可以将文件作为流读取,这样它就不会产生很多内存开销?可能类似于java中的StreamReader
类?
答案 0 :(得分:6)
你可以用fgets()
一次一行地读取文件,只要你每次都重新分配你的变量(而不是将数据存储在一个数组或其他内容中,它们将保留在内存中)。
单向,文件大小为65 MB:
// load the whole thing
$file = file_get_contents('hugefile.txt');
echo memory_get_peak_usage() / 1024 / 1024, ' MB';
// prints '66.153938293457 MB'
第二种方式:
// load only one line at a time
$fh = fopen('hugefile.txt', 'r');
while ($line = fgets($fh)) {}
echo memory_get_peak_usage() / 1024 / 1024, ' MB';
// prints '0.62477111816406 MB'
此外,如果您想要以不同的格式重新排列数据,您可以使用fgetcsv()
将每行解析为CSV。