3

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

4

1 回答 1

7

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'

此外,如果您想以不同的格式重新排列数据,您可以在使用时将每一行解析为 CSV fgetcsv()

于 2012-05-03T06:14:53.113 回答