现在有一个10G文件,要随机获取其中的一行数据。肯定不能一次把内容全部读取!!!
因此可以按字节随机读取
使用函数:
filesize 获取此文件的总字节
ftell 当前文件指针位置
fseek 定位文件指针位置
fgets 按行读取文件
实现思路有了吧:
开始位置可以随机取,即可实现随机读取数据。
比如总字节100,一行10字节,开始读取字节的位置随机取0~90字节中间的数。
为了数据的完整性,可以多读几行,那么结束位置就设为:开始位置+行数*每行字节大小
反正大概那个数就行了
因为每次读取不可能是一行的头,因为可以多读几行,然后用explode分割成一个数组,抛弃数组首尾,再随机获取其中的一条
下面这是按字节分页读取文件的内容,可以做个参考
public static function readFileBySize($file, $currentPage=1, $pageSize=100000)
{
$read = "";
$fileSize = filesize($file);
$totalPage = ceil($fileSize/$pageSize);
$start = filesize($file) - $currentPage*$pageSize;
$stop = filesize($file) - ($currentPage-1)*$pageSize;
$fp = fopen($file, 'r');
fseek($fp, $start, SEEK_SET);
while(ftell($fp) < $stop){
$read .= fgets($fp);
}
fclose($fp);
$memory = function_exists('ini_get') ? ini_get("memory_limit"):0;
$returnData = array(
"fileSize" => $fileSize,
"pageSize" => $pageSize,
"totalPage" => $totalPage,
"currentPage" => $currentPage,
"memory" => $memory,
"data" => $read
);
return $returnData;
}