我有一個功能,從文件中刪除線。我正在處理大文件(超過100Mb)。我有256MB的PHP內存,但是用100MB的CSV文件處理帶外線條的功能。PHP性能不佳。隨着大文件內存爆炸!我該如何重構?
什麼功能必須做的是這樣的:
本來我有CSV這樣的:
Copyright (c) 2007 MaxMind LLC. All Rights Reserved. locId,country,region,city,postalCode,latitude,longitude,metroCode,areaCode 1,"O1","","","",0.0000,0.0000,, 2,"AP","","","",35.0000,105.0000,, 3,"EU","","","",47.0000,8.0000,, 4,"AD","","","",42.5000,1.5000,, 5,"AE","","","",24.0000,54.0000,, 6,"AF","","","",33.0000,65.0000,, 7,"AG","","","",17.0500,-61.8000,, 8,"AI","","","",18.2500,-63.1667,, 9,"AL","","","",41.0000,20.0000,,
當我通過CSV文件到這個功能我:
locId,country,region,city,postalCode,latitude,longitude,metroCode,areaCode 1,"O1","","","",0.0000,0.0000,, 2,"AP","","","",35.0000,105.0000,, 3,"EU","","","",47.0000,8.0000,, 4,"AD","","","",42.5000,1.5000,, 5,"AE","","","",24.0000,54.0000,, 6,"AF","","","",33.0000,65.0000,, 7,"AG","","","",17.0500,-61.8000,, 8,"AI","","","",18.2500,-63.1667,, 9,"AL","","","",41.0000,20.0000,,
它只有去掉第一行,沒有更多。問題在於大文件的這種功能的性能,它打開了內存。
功能是:
public function deleteLine($line_no, $csvFileName) {
// this function strips a specific line from a file
// if a line is stripped, functions returns True else false
//
// e.g.
// deleteLine(-1, xyz.csv); // strip last line
// deleteLine(1, xyz.csv); // strip first line
// Assigna o nome do ficheiro
$filename = $csvFileName;
$strip_return=FALSE;
$data=file($filename);
$pipe=fopen($filename,'w');
$size=count($data);
if($line_no==-1) $skip=$size-1;
else $skip=$line_no-1;
for($line=0;$line<$size;$line++)
if($line!=$skip)
fputs($pipe,$data[$line]);
else
$strip_return=TRUE;
return $strip_return;
}
有可能重構這個功能不與256MB PHP內存炸掉?
給我一些線索。
此致
你可以先用file()將ENTIRE文件讀入內存。逐行閱讀,並在完成一行時回寫到磁盤。 – Craige 2010-12-21 16:55:44
當你有自己的服務器時,考慮用`perl`或`sed` ;-)來做這件事。 – thedom 2010-12-21 17:00:13