通过相对较小的数据块在php中读取文件的最佳方法是什么?
例如,读取5MB然后释放该内存并读取另外5MB
我在php中编写一个解析工具,需要读取一个巨大的文件并将其转换为CSV格式。
我的问题是我经常超出允许的内存限制,并且在我的环境中提升它不是一个选项。
这是完成工作的代码的一部分:
$i = 0;
$fileName = "test.txt";
$file = fopen($fileName,'r');
while($i <= 2000) {
$line = fgets($file);
$streetsheet[$i] = preg_split('@\ @',$line,NULL, PREG_SPLIT_NO_EMPTY);
++$i;
}
fclose($file);
$fp = fopen('result.csv','w');
foreach($streetsheet as $key=>$value) {
fputcsv($fp, $value);
}
例如,在上面显示的剪辑中,我正在读取文件的前2000行,并且它工作得很好。
当我将条件更改为
时会出现问题 while(!feof($file)){\*....*\}
它立即告诉我,我已超出允许的内存限制,然后它告诉我导致问题的行是我正在使用preg_split的行。
所以我想知道读取文件的最佳方式是什么?一次说1000行?
谢谢!
如果你要进行downvote,至少要有共同的礼貌来解释原因
答案 0 :(得分:2)
你已经已经在“部分”中阅读:你正在逐行阅读它。问题是你将所有的行都粘贴到一个数组中然后转储数组。
相反,读取一行并输出一行并完全跳过该数组:
$fileName = "test.txt";
$file = fopen($fileName,'r');
$fp = fopen('result.csv','w');
while(!feof($file)) {
$line = fgets($file);
$value = preg_split('@\ @',$line,NULL, PREG_SPLIT_NO_EMPTY);
fputcsv($fp, $value);
}
fclose($file);
fclose($fp);