2017-08-23 41 views
0

我有這個1000萬字的文件,每行一個字。我試圖打開該文件,讀取每一行,將其放入一個數組並計算每個單詞的出現次數。有沒有PHP函數可讀的最大行數

wartek 
mei_atnz 
sommerray 
swaggyfeed 
yo_bada 
ronnieradke 
… and so on (10M+ lines) 

我可以打開該文件,讀取它的大小,甚至線echo在瀏覽器上線(這是很長的,當然),線解析它,當我試圖執行任何其他操作,腳本只是拒絕執行。沒有錯誤,沒有警告,沒有die(…),沒有。

訪問文件總是可以的,但是這些操作不會以相同的成功執行。我想這和它的工作...

while(!feof($pointer)) { 
    $row = fgets($pointer); 
    print_r($row); 
} 

...但這並不:

while(!feof($pointer)) { 
    $row = fgets($pointer); 
    array_push($dest, $row); 
} 

每次(不行的大文件,還好有小也試圖與SplFileObjectfile($source, FILE_IGNORE_NEW_LINES)同樣的結果文件)

猜測問題不是大小(150 ko),但可能是長度(10M +行),我將該文件分割爲大約20k而沒有任何改進,然後再將其減少到大約8k行,它的工作。

我也去掉了時間限制與set_time_limit(0);或刪除(幾乎)所有內存限制均在php.ini中和我的腳本ini_set('memory_limit', '8192M'); .Regarding的錯誤,我可以,我設置的error_reporting(E_ALL);在頂部我腳本。

所以問題是:

  • 是有可以通過PHP內置函數讀取行的最大數目?
  • 爲什麼我可以echoprint_r但不執行任何其他操作?
+0

當解釋器嘗試分配比允許分配更多的內存時,腳本將被終止。會生成一條錯誤消息,但可能您的PHP解釋器和/或腳本本身已關閉['error_reporting'](http://php.net/manual/en/function.error-reporting.php)。這就是爲什麼你沒有收到任何錯誤信息。錯誤報告也可能沒有關閉,但它被配置爲不顯示錯誤,只將它們保存在'php_errors.log'中。 – axiac

+0

沒有限制可以讀取的行或字節。唯一的限制是['memory_limit']的配置值(http://php.net/manual/en/ini.core.php#ini.sect.resource-limits)以及進程可用的計算機內存。請注意,PHP內部用來管理它所使用的變量的數據結構也佔用內存,並被計入「memory_limit」。 – axiac

+0

錯誤報告被設置爲E_ALL(忘記提及它,我編輯了我的帖子)並在** php。ini **,參數'display_errors'設置爲'on'on' –

回答

0

我想你可能會運行到執行時間較長:

How to increase the execution timeout in php?

不同的操作需要不同的時間。打印可能比將10M新數據逐個推入陣列容易得多。奇怪的是,您不會收到任何錯誤消息,您應該在某處收到進程超時。

+0

我已經增加了腳本頂部的max_execution_time(並且它也在我的** php.ini **中設置爲「0」)。當我做別的事情而不是展示線條時,這個過程就不會開始 –