在php中读取文件的流

在php中读取文件的流,php,memory,Php,Memory,我有一个大的csv文件(大约30M),我想用我的php程序读取它,并将其转换为另一种格式,然后将其保存为不同的小文件。当我使用传统的fopen、fwrite方法时,我得到一个错误,上面写着致命错误:允许的内存大小134217728字节已耗尽。我知道我可以在php.ini中设置内存限制,但是有没有办法将文件作为流读取,这样就不会产生太多内存开销?可能类似于java中的StreamReaderclasses?您可以一次读取一行文件,前提是您每次都重新分配变量(而不是将行存储在数组或其他东西中,它们将

我有一个大的csv文件(大约30M),我想用我的php程序读取它,并将其转换为另一种格式,然后将其保存为不同的小文件。当我使用传统的fopen、fwrite方法时,我得到一个错误,上面写着
致命错误:允许的内存大小134217728字节已耗尽
。我知道我可以在php.ini中设置内存限制,但是有没有办法将文件作为流读取,这样就不会产生太多内存开销?可能类似于java中的
StreamReader
classes?

您可以一次读取一行文件,前提是您每次都重新分配变量(而不是将行存储在数组或其他东西中,它们将保留在内存中)

单向,使用~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'

此外,如果您想以不同的格式重新排列数据,您可以使用CSV来解析每一行。

您可以发布代码吗?我认为您正在一次读取所有源文件,或者可能会为每个小文件分配内存,而这些文件之间不会被释放。@GolezTrol是的,这是正确的。Wiseguy的回答解决了这个问题