>  기사  >  백엔드 개발  >  매우 큰 파일을 읽기 위한 PHP 예제 코드

매우 큰 파일을 읽기 위한 PHP 예제 코드

WBOY
WBOY원래의
2016-08-08 09:19:26797검색

데이터의 양이 많아서 문제는 파일 하나가 너무 크다는 것입니다. 이 파일을 여는 것이 쉽지 않습니다. 메모장에 기대지 마세요. 결정적으로 충돌이 발생합니다

결국 작년에 여러 웹사이트의 계정 정보 데이터베이스가 유출되었는데, 매우 강력합니다. 여러 데이터베이스를 다운로드하고 이러한 계정 정보를 분석하기 위해 데이터 분석가로부터 학습을 준비했습니다. 이 데이터 정보는 "정리"되어 있지만, 결국 데이터의 양이 너무 많기 때문에 스스로 공부하는 것이 매우 유용합니다.
번호 대용량 데이터로 인해 발생하는 문제는 단일 파일이 매우 커서 이 파일을 여는 것이 쉽지 않다는 것입니다. 메모장이 즉시 정지될 것이라고 기대하지 마십시오. MSSQL 클라이언트도 이렇게 큰 SQL 파일을 열 수 없습니다. 메모리 부족이 보고되는 이유는 MSSQL이 데이터를 읽을 때 읽은 데이터를 한꺼번에 메모리에 집어넣기 때문이라고 합니다. .
Navicat Premium
여기에는 수백 메가바이트의 SQL 파일을 전혀 지연 없이 쉽게 열 수 있는 매우 강력한 Navicat Premium 소프트웨어가 있습니다. 게다가 이 클라이언트 소프트웨어는 MSSQL, MYSQL, Oracle 등과 같은 다양한 데이터베이스에 대한 연결을 지원합니다. 다른 기능들도 천천히 혼자서 공부하겠습니다.
그래도 Navicat을 사용하면 274MB SQL 파일 CSDN을 열 수 있지만 내용이 무의미하고 이러한 계정 정보에 대한 쿼리, 분류, 통계 작성 등이 불편합니다. 오직 방법은 데이터를 하나씩 읽은 다음 각 레코드의 서로 다른 조각을 분할한 다음 이러한 조각을 데이터 필드 형식으로 데이터베이스에 저장하여 나중에 편리하게 사용할 수 있도록 하는 것입니다.
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의 값에 대해 시스템에 따라 함수도 다르고, 전달되는 값도 다릅니다. "rn"은 Windows에서 사용되고 "n"은 linux/unix에서 사용되고 "r"은 Mac OS에서 사용됩니다.
일반적인 프로그램 실행 과정: 먼저 파일을 읽기 위한 몇 가지 기본 변수를 정의한 다음 파일을 열고 파일의 지정된 위치에 포인터를 놓고 지정된 크기의 내용을 읽습니다. 필요한 줄 수에 도달하거나 파일이 끝날 때까지 읽을 때마다 콘텐츠를 변수에 저장합니다.
프로그램의 모든 것이 계획대로 작동할 것이라고 절대 가정하지 마세요.
루트 위의 코드에 따르면 파일 내에서 지정된 위치와 크기의 데이터를 얻을 수는 있지만 전체 과정은 한 번만 실행되어 모든 데이터를 얻을 수는 없습니다. 실제로 모든 데이터를 얻으려면 이 루프를 사용할 수 있습니다. 파일이 끝나는지 확인하기 위해 루프를 추가하는 것은 외부 레이어에 추가되지만 이는 시스템 리소스 낭비이며 파일이 너무 커서 끝까지 읽을 수 없기 때문에 PHP 실행 시간 초과가 발생할 수도 있습니다. 또 다른 방법은 데이터를 마지막으로 읽은 후 인덱스를 기록하고 저장하는 것입니다. 바늘의 위치, 그리고 다시 루프를 실행하면 포인터가 마지막 끝 위치에 위치하게 되므로 한 루프에서 파일을 처음부터 끝까지 읽을 필요가 없습니다.
사실 아직 CSDN 데이터베이스를 데이터베이스로 가져오지 않았습니다. 유출된 지 며칠 뒤에 CNBETA에 대한 분석이 있었기 때문입니다. ㅎㅎ 조치가 너무 빨랐습니다. 다른 사람들이 이미 이 작업을 수행한 것을 보면 자동으로 해당 작업을 수행할 동기가 별로 없지만, 배우기 위해서는 여전히 시간을 들여 완료해야 합니다.

위 내용은 관련 내용을 포함하여 PHP에서 매우 큰 파일을 읽는 예제 코드를 소개합니다. PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.