큰 파일을 한 줄씩 읽는 방법
PHP큰 파일을 한 줄씩 읽는 방법
PHP를 메모리에 완전히로드하지 않고 한 줄씩 파일을 읽는 방법?
내 파일이 너무 커서 메모리에서 열 수 없기 때문에 항상 메모리 오류가 발생합니다.
파일 크기는 1GB입니다.
해결법
-
==============================
1.fgets () 함수를 사용하여 파일을 한 줄씩 읽을 수 있습니다.
fgets () 함수를 사용하여 파일을 한 줄씩 읽을 수 있습니다.
$handle = fopen("inputfile.txt", "r"); if ($handle) { while (($line = fgets($handle)) !== false) { // process the line read. } fclose($handle); } else { // error opening the file. }
-
==============================
2.
if ($file = fopen("file.txt", "r")) { while(!feof($file)) { $line = fgets($file); # do same stuff with the $line } fclose($file); }
-
==============================
3.당신은 파일을위한 객체 지향 인터페이스 클래스를 사용할 수 있습니다 - SplFileObject http://php.net/manual/en/splfileobject.fgets.php (PHP 5> = 5.1.0)
당신은 파일을위한 객체 지향 인터페이스 클래스를 사용할 수 있습니다 - SplFileObject http://php.net/manual/en/splfileobject.fgets.php (PHP 5> = 5.1.0)
<?php $file = new SplFileObject("file.txt"); // Loop until we reach the end of the file. while (!$file->eof()) { // Echo one line from the file. echo $file->fgets(); } // Unset the file to call __destruct(), closing the file handle. $file = null;
-
==============================
4.버퍼링 기술을 사용하여 파일을 읽습니다.
버퍼링 기술을 사용하여 파일을 읽습니다.
$filename = "test.txt"; $source_file = fopen( $filename, "r" ) or die("Couldn't open $filename"); while (!feof($source_file)) { $buffer = fread($source_file, 4096); // use a buffer of 4KB $buffer = str_replace($old,$new,$buffer); /// }
-
==============================
5.큰 파일을 여는 경우 전체 파일을 메모리에로드하지 않으려면 fgets ()와 함께 Generators를 사용하는 것이 좋습니다.
큰 파일을 여는 경우 전체 파일을 메모리에로드하지 않으려면 fgets ()와 함께 Generators를 사용하는 것이 좋습니다.
/** * @return Generator */ $fileData = function() { $file = fopen(__DIR__ . '/file.txt', 'r'); if (!$file) die('file does not exist or cannot be opened'); while (($line = fgets($file)) !== false) { yield $line; } fclose($file); };
다음과 같이 사용하십시오.
foreach ($fileData() as $line) { // $line contains current line }
foreach () 내부에서 개별 파일 행을 처리 할 수 있습니다.
참고 : 생성기는> = PHP 5.5 이상을 필요로합니다.
-
==============================
6.파일에 포함 된 줄의 배열을 반환하는 file () 함수가 있습니다.
파일에 포함 된 줄의 배열을 반환하는 file () 함수가 있습니다.
foreach(file('myfile.txt') as $line) { echo $line. "\n"; }
-
==============================
7.
foreach (new SplFileObject(__FILE__) as $line) { echo $line; }
-
==============================
8.'while (! feof ... fgets ()'에주의를 기울여야한다. fgets는 오류 (returnfing false)를받을 수 있으며 파일의 끝에 도달하지 않고 영원히 반복 할 수있다. codaddict는 정확하기에 가장 가깝지만 'while fgets' 루프가 끝나면 feof를 확인하고, 그렇지 않으면 오류가 발생합니다.
'while (! feof ... fgets ()'에주의를 기울여야한다. fgets는 오류 (returnfing false)를받을 수 있으며 파일의 끝에 도달하지 않고 영원히 반복 할 수있다. codaddict는 정확하기에 가장 가깝지만 'while fgets' 루프가 끝나면 feof를 확인하고, 그렇지 않으면 오류가 발생합니다.
-
==============================
9.이 질문에 대한 대중적인 해결책 중 하나는 개행 문자에 문제가있을 것입니다. 간단한 str_replace를 사용하면 꽤 쉽게 수정할 수 있습니다.
이 질문에 대한 대중적인 해결책 중 하나는 개행 문자에 문제가있을 것입니다. 간단한 str_replace를 사용하면 꽤 쉽게 수정할 수 있습니다.
$handle = fopen("some_file.txt", "r"); if ($handle) { while (($line = fgets($handle)) !== false) { $line = str_replace("\n", "", $line); } fclose($handle); }
-
==============================
10.이 방법으로 나는 매우 큰 파일 (100G까지 테스트 됨)로 관리합니다. fgets ()보다 빠릅니다.
이 방법으로 나는 매우 큰 파일 (100G까지 테스트 됨)로 관리합니다. fgets ()보다 빠릅니다.
$block =1024*1024;//1MB or counld be any higher than HDD block_size*2 if ($fh = fopen("file.txt", "r")) { $left=''; while (!feof($fh)) {// read the file $temp = fread($fh, $block); $fgetslines = explode("\n",$temp); $fgetslines[0]=$left.$fgetslines[0]; if(!feof($fh) )$left = array_pop($lines); foreach ($fgetslines as $k => $line) { //do smth with $line } } } fclose($fh);
-
==============================
11.SplFileObject는 큰 파일을 다룰 때 유용합니다.
SplFileObject는 큰 파일을 다룰 때 유용합니다.
function parse_file($filename) { try { $file = new SplFileObject($filename); } catch (LogicException $exception) { die('SplFileObject : '.$exception->getMessage()); } while ($file->valid()) { $line = $file->fgets(); //do something with $line } //don't forget to free the file handle. $file = null; }
-
==============================
12.분명한 대답은 모든 응답에 없었습니다. PHP는 스트리밍 구분자 파서가 정확히 그 목적을 위해 만들어진다.
분명한 대답은 모든 응답에 없었습니다. PHP는 스트리밍 구분자 파서가 정확히 그 목적을 위해 만들어진다.
$fp=fopen() while ($line = stream_get_line($fp, 1024 * 1024, "\n")) { echo $line; } fclose($fp);
-
==============================
13.배열 반환으로 읽기 기능
배열 반환으로 읽기 기능
function read_file($filename = ''){ $buffer = array(); $source_file = fopen( $filename, "r" ) or die("Couldn't open $filename"); while (!feof($source_file)) { $buffer[] = fread($source_file, 4096); // use a buffer of 4KB } return $buffer; }
from https://stackoverflow.com/questions/13246597/how-to-read-a-large-file-line-by-line by cc-by-sa and MIT license
'PHP' 카테고리의 다른 글
.htaccess로 하위 도메인을 즉석에서 만듭니다 (PHP). (0) | 2018.09.05 |
---|---|
페이지를 다시로드하지 않고 양식 제출 (0) | 2018.09.05 |
PHP로 비동기 HTTP 요청을하는 법 (0) | 2018.09.05 |
print_r ()의 출력에서 변수를 볼 수 있지만 코드에서 액세스하는 방법을 모릅니다. (0) | 2018.09.05 |
PHP에서 변수 이름을 문자열로 가져 오는 방법은 무엇입니까? (0) | 2018.09.05 |