流读取 php 中的文件


Stream reading a file in php

我有一个大的csv文件(约30M),我想使用我的php程序读取并将其转换为另一种格式并将其另存为不同的小文件。当我使用传统的 fopen 、fwrite 方法时,我收到一个错误,说Fatal error: Allowed memory size of 134217728 bytes exhausted。我知道我可以在 php 中设置内存限制.ini但是有什么方法可以将文件作为流读取,这样它就不会产生太多内存开销?可能类似于 java 中的StreamReader类?

您可以使用 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。