php怎樣讀取大文件
① php有規律大文件的讀取與寫入
這幾天在做一個東西 研究PHP讀取行數較多的文件(大概上百萬行) 考慮到效率問題 進行了簡單的研究 總結如下
第一條 file()函數的效率問題
file()函數的效率很底下 如果是有規律的文件 比如每行一條相應數據 那麼盡量不要是用file()函數
可以使用file_get_contents()然後用explode切割 這樣效率會快三分之一
舉個例子:
文件樣式如下:
n
n
n
n
n
n
nnnnnnnnnnnn
如果用file($file)讀入的話 耗時很長
可以用如下方法explode("n" file_get_contents($file));效率會快很多
第二條 數組的遍歷方式
數據已經被讀入數組了 下面就是遍歷了
我所需要的是確定數組中有無一個值的存在 比如大消說 是蠢仿如否在數組中 首先想到的是in_array()
不過實驗了下發現效率很低下 於是參考別人的代碼想到一個辦法 把數組翻轉過來 變成所有值都為 原來的值變成了索引 那麼只要我在if里寫($arr[索引]== )去判斷帶啟 果然效率高出很多
在數組的遍歷過程中 如果數組個頭非常大 並且數組中的數據並不是全能用到的話 最好把用來遍歷的數組抽出來 這樣會提高很多效率
第三條 數組的存儲
把計算過後的數據保存起來 存在一個文件中 考慮了三種方法 一種是直接寫成php文件 一種是serialize 一種是json串
第一種方式
直接寫入文件 保存成PHP
需要的時候直接require進來
第二種方式 把變數serialize然後file_put_contents()進入文件 使用的時候unserialize就ok
第三種方式和第二種類似 只不過寫成了json串
lishixin/Article/program/PHP/201311/21126
② PHP實現在有限內存中的大文件讀取
方法鉛肢一:通過yield的生槐州世成器實現有限內存中的大跡源文件讀取
方法二:使用SPL 庫 提供的 SplFileObject 類
③ php 使用file_get_contents讀取大文件的方法
當我們遇到文本文件體積很大時,比如超過幾十M甚至幾百M幾G的大文件臘則,用記事本或者其它編輯器打開往往不能成功,因為他們都需要把文件內容全部放到內存裡面,這時就會發生內存溢出而打開錯誤,遇到這種情況我們可以使用PHP的文件讀取函數file_get_contents()進行分段讀取。
函數說明
string
file_get_contents
(
string
$filename
[,
bool
$use_include_path
[,
resource
$context
[,
int
$offset
[,
int
$maxlen
]]]]
)
和
file()
一樣,只除了
file_get_contents()
把文件讀入一棗局舉個字元串。將在參數
offset
所指定的位置開始讀取長度為
maxlen
的內容。如果失敗,file_get_contents()
將返回
FALSE。
file_get_contents()
函數是用來將文件的內容讀入到一個字元串中的首選方法。如果操作系統支持還會使用內存映射技術來增強性能。
應用:凳碧
復制代碼
代碼如下:
$str
=
$content=file_get_contents("2.sql",FALSE,NULL,1024*1024,1024);
echo
$str;
如果針對較小文件只是希望分段讀取並以此讀完可以使用fread()函數
復制代碼
代碼如下:
$fp=fopen('2.sql','r');
while
(!feof($fp)){
$str.=fread($fp,
filesize
($filename)/10);//每次讀出文件10分之1
//進行處理
}
echo
$str;