2013-04-25 66 views
2

通過相對較小的數據塊讀取php文件的最佳方式是什麼?使用PHP讀取「塊」中的文件使用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有最起碼的禮貌解釋爲什麼

回答

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); 
+0

天啊..這是令人尷尬的,你是非常正確的! 我只是使用其他數組進行測試,並且在完成它之後我忘記刪除它,非常感謝! – ILikeTacos 2013-04-25 00:37:04