資料量大帶來的問題就是單一文件很大,能夠開啟這個文件相當不容易,記事本就不要指望了,果斷死機
去年年底的各種網站帳號資訊的資料庫洩漏,很是給力啊,趁機也下載了幾個資料庫,準備學學資料分析家來分析一下這些帳號資訊。雖然這些數據資訊都已經「整理」過的,不過自己拿來學習也挺有用的,畢竟有這麼大的數據量。
數
據量大帶來的問題就是單一文件很大,能夠打開這個文件相當不容易,記事本就不要指望了,果斷死機。用MSSQL的客戶端也打不開這麼大的SQL文件,直接
報內存不足,原因據說是MSSQL在讀取資料的時候,是一次性地將讀取到的資料放在記憶體中,如果資料量過大,而記憶體不足,則會直接導致系統癱掉。
Navicat Premium
這兒推薦一個軟體Navicat Premium,相當給力啊,幾百兆的SQL檔案輕鬆就打開了,一點都不卡。而且這個客戶端軟體支援MSSQL、MYSQL、Oracle…等等各種資料庫的連接,其它的許多功能就自己慢慢研究了。
雖
然用Navicat可以打開CSDN這個274MB的SQL文件,但是內容卻是沒意義的,而且也不方便對這些帳號資訊進行查詢、分類、統計等等操作。唯一
的方法就是把這些資料一一讀取出來,然後分拆每筆記錄的不同片段,再將這些片段以資料欄位的格式存入資料庫,這樣就可以方便以後的使用了。
使用PHP讀取超大檔案
PHP
有很多種文件讀取的方式,根據目標文件的不同,採取更合適的方法,可有效提高執行效率。由於CSDN資料庫檔案很大,所以我們盡量不在短時間內全都讀取
出來,畢竟每讀取一條資料還要對其分拆和寫入操作。那麼比較合適的方式就是對檔案進行分區域地讀取,透過使用PHP的fseek和fread結合,即可
做到隨意讀取文件中的某一部分數據,以下是實例代碼:
代码如下: function readBigFile($filename, $count = 20, $tag = "\r\n") { $content = "";//最终内容 $current = "";//当前读取内容寄存 $step= 1;//每次走多少字符 $tagLen = strlen($tag); $start = 0;//起始位置 $i = 0;//计数器 $handle = fopen($filename,'r+');//读写模式打开文件,指针指向文件起始位置 while($i < $count && !feof($handle)) { fseek($handle, $start, SEEK_SET);//指针设置在文件开头 $current = fread($handle,$step);//读取文件 $content .= $current;//组合字符串 $start += $step;//依据步长向前移动 //依据分隔符的长度截取字符串最后免得几个字符 $substrTag = substr($content, -$tagLen); if ($substrTag == $tag) { //判断是否为判断是否是换行或其他分隔符 $i++; $content .= "<br />"; } } //关闭文件 fclose($handle); //返回结果 return $content; } $filename = "csdn.sql";//需要读取的文件 $tag = "\n";//行分隔符 注意这里必须用双引号 $count = 100;//读取行数 $data = readBigFile($filename,$count,$tag); echo $data;
關於函數傳入的變數$tag的值,根據系統不一樣,傳入的值也是有區別的: Windows用”rn”,linux/unix用”n”,Mac OS用”r”。
程式執行的大概流程:先定義讀取檔案的一些基礎變量,然後開啟文件,將指標定位在文件的指定位置,並讀取指定大小的內容。每讀取一次將內容儲存在變數中,直到達到讀取要求的行數或檔案結束。
絕對不要假定程式中的一切都將按計畫運作。
根
根據上面的程式碼,雖然能夠得到文件中指定位置、指定大小的數據,但這整個過程只執行了一次,並不能得到所有的數據。其實要得到所有的數據,可以在這個循環的
外層再加入判斷檔案是否結束的循環,但這很浪費系統資源,甚至因為檔案過大一直沒辦法讀完而導致PHP執行逾時。另一種方法就是記錄並儲存上次讀取資料後指
針所在的位置,然後再次執行該循環的時候,將指標定位在上次結束的位置,這樣就不存在一次循環要把文件從頭讀到尾的情況。
其實CSDN這個資料庫我到現在都還沒導入資料庫,因為當時洩漏後沒幾天CNBETA上就有一個分析了,呵呵,動作太快了。當看到別人已經做了這個事之後,自動就沒有太多動力來做了,不過為了學習,還是要抽時間把這個事完成了。
以上就介紹了PHP讀取超大檔案的實例程式碼,包含了面向的內容,希望對PHP教學有興趣的朋友有幫助。