去年年底的各種網站帳號信息的數據庫洩漏很是給力啊趁機也下載了幾個數據庫准備學學數據分析家來分析一下這些帳號信息雖然這些數據信息都已經被“整理”過的不過自己拿來學習也挺有用的畢竟有這麼大的數據量
數據量大帶來的問題就是單個文件很大能夠打開這個文件相當不容易記事本就不要指望了果斷死機用MSSQL的客戶端也打不開這麼大的SQL文件直接報內存不足原因據說是MSSQL在讀取數據的時候是一次性地將讀取到的數據放在內存中如果數據量過大而內存不足則會直接導致系統癱掉
Navicat Premium
這兒推薦一個軟件Navicat Premium相當給力啊幾百兆的SQL文件輕松就打開了一點都不卡而且這個客戶端軟件支持MSSQLMYSQLOracle……等等各種數據庫的連接其它的很多功能就自己慢慢研究了
雖然用Navicat可以打開CSDN這個MB的SQL文件但是內容卻是沒意義的而且也不方便對這些帳號信息進行查詢分類統計等等操作唯一的方法就是把這些數據一條一條地讀取出來然後分拆每條記錄的不同片段再將這些片段以數據字段的格式存入數據庫這樣就可以方便以後的使用了
使用PHP讀取超大文件
PHP有很多種文件讀取的方式根據目標文件的不同采取更合適的方法可有效地提高執行效率由於CSDN數據庫文件很大所以我們盡量不在短時間內全都讀取出來畢竟每讀取一條數據還要對其分拆和寫入操作那麼比較合適的方式就是對文件進行分區域地讀取通過使用PHP的fseek和fread相結合即可做到隨意讀取文件中的某一部份數據下面是實例代碼
復制代碼 代碼如下:
function readBigFile($filename $count = $tag = "rn") {
$content = "";//最終內容
$current = "";//當前讀取內容寄存
$step= ;//每次走多少字符
$tagLen = strlen($tag);
$start = ;//起始位置
$i = ;//計數器
$handle = fopen($filenamer+);//讀寫模式打開文件指針指向文件起始位置
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 = "csdnsql";//需要讀取的文件
$tag = "n";//行分隔符 注意這裡必須用雙引號
$count = ;//讀取行數
$data = readBigFile($filename$count$tag);
echo $data;
關於函數傳入的變量$tag的值根據系統不一樣傳入的值也是有區別的Windows用”rn”linux/unix用”n”Mac OS用”r”
程序執行的大概流程先定義讀取文件的一些基礎變量然後打開文件將指針定位在文件的指定位置並讀取指定大小的內容每讀取一次將內容存儲在變量中直到達到讀取要求的行數或文件結束
絕不要假定程序中的一切都將按計劃運行
根據上面的代碼雖然能夠得到文件中指定位置指定大小的數據但這整個過程只執行了一次並不能得到所有的數據其實要得到所有的數據可以在這個循環的外層再添加判斷文件是否結束的循環但這很浪費系統資源甚至由於文件過大一直沒法讀完而導致PHP執行超時另一種方法就是記錄並存儲上次讀取數據後指針所在的位置然後再次執行該循環的時候將指針定位在上次結束的位置這樣就不存在一次循環要把文件從頭讀到尾的情況
其實CSDN這個數據庫我到現在都還沒有導入數據庫因為當時洩漏後沒幾天CNBETA上就有一個分析了呵呵動作太快了當看到別人已經做了這個事之後自動就沒有多少動力來做了不過為了學習還是要抽時間把這個事完成了
From:http://tw.wingwit.com/Article/program/PHP/201311/21064.html