2013-07-22 16 views
2

我有一個包含劇情數據的文件。每條線總共有4個座標,數據文件可以超過1 GB。比方說,我想獲得數據文件中的第三列,哪種方法應該考慮良好的實踐並且更快?PHP - exec awk或fread更快地讀取非常大的文件上的列

使用執行:

exec("awk '{ print $3 }' data", $output); 

使用PHP腳本:

$data = file("data"); 
$points = array(); 
foreach($data as $line) 
    $points[] = $line[2]; 

而且,由於服務器不允許讀取大型文件,我必須用FREAD閱讀幾個部分文件。但是fread不夠聰明,必須做一些工作來結合每個部分的最後一行。任何建議或任何更好的方法來讀取文件在PHP中的列?

+0

您可以在前後添加microtime(true)以獲得成本時間。你可以看到哪個更快。 – TroyCheng

+0

fseek也許(不知道,因爲系統調用也有一定的代價) – bwoebi

+0

這是什麼樣的數據文件?它是CSV嗎?另外,'awk'如何比'fread()'更聰明? –

回答

3

這裏/file是3.1 GB的大文件:

root# time awk '{ print $3 }' /file >/dev/null 

real 1m42.430s 
user 1m0.241s 
sys 0m2.198s 

沒關係。 awk爲±1.7分鐘。讓我們來測試PHP(沒有字段拆分,只有第三個字符):

root# time php -r '$fp = fopen("/file", "r"); while (($buf = fgets($fp)) !== false) echo $buf[2]; fclose($fp);' >/dev/null 

real 4m17.322s 
user 3m16.571s 
sys 0m31.625s 

對於PHP而言爲±4.3分鐘!我不想想要使用@ Jack的代碼需要多長時間......

PHP遠遠低於awk。在真正的大文件上,使用awk(由exec()調用)。正如您在這裏看到的,PHP在用戶空間中花費了大量時間(比awk多三倍)。

+0

是的,我檢查php使用更多的資源。但是,我總是擔心php執行不是一個好習慣,或者有人會說這是一種邪惡。我應該總是使用exec還是僅僅模仿行爲? – Ben

+0

取決於。如果您想在不受您控制的服務器上分發軟件(例如,這些功能可能被禁用等),您應該使用PHP來模擬它。 (或者最好:檢查awk是否存在,你可以使用exec(),如果不是在PHP中模仿它)。但是,如果可以的話,選擇最快的。像eval(),exec()等東西如果你傳遞了無效的用戶輸入,它就是___唯一____。 – bwoebi

0

fgets是你的朋友 - http://ie.php.net/fgets。您可以逐行讀取文件,而無需將整個文件加載到內存中。

相關問題