복붙노트

큰 파일을 한 줄씩 읽는 방법

PHP

큰 파일을 한 줄씩 읽는 방법

PHP를 메모리에 완전히로드하지 않고 한 줄씩 파일을 읽는 방법?

내 파일이 너무 커서 메모리에서 열 수 없기 때문에 항상 메모리 오류가 발생합니다.

파일 크기는 1GB입니다.

해결법

  1. ==============================

    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. ==============================

    2.

    if ($file = fopen("file.txt", "r")) {
        while(!feof($file)) {
            $line = fgets($file);
            # do same stuff with the $line
        }
        fclose($file);
    }
    
  3. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    6.파일에 포함 된 줄의 배열을 반환하는 file () 함수가 있습니다.

    파일에 포함 된 줄의 배열을 반환하는 file () 함수가 있습니다.

    foreach(file('myfile.txt') as $line) {
       echo $line. "\n";
    }
    
  7. ==============================

    7.

    foreach (new SplFileObject(__FILE__) as $line) {
        echo $line;
    }
    
  8. ==============================

    8.'while (! feof ... fgets ()'에주의를 기울여야한다. fgets는 오류 (returnfing false)를받을 수 있으며 파일의 끝에 도달하지 않고 영원히 반복 할 수있다. codaddict는 정확하기에 가장 가깝지만 'while fgets' 루프가 끝나면 feof를 확인하고, 그렇지 않으면 오류가 발생합니다.

    'while (! feof ... fgets ()'에주의를 기울여야한다. fgets는 오류 (returnfing false)를받을 수 있으며 파일의 끝에 도달하지 않고 영원히 반복 할 수있다. codaddict는 정확하기에 가장 가깝지만 'while fgets' 루프가 끝나면 feof를 확인하고, 그렇지 않으면 오류가 발생합니다.

  9. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    12.분명한 대답은 모든 응답에 없었습니다. PHP는 스트리밍 구분자 파서가 정확히 그 목적을 위해 만들어진다.

    분명한 대답은 모든 응답에 없었습니다. PHP는 스트리밍 구분자 파서가 정확히 그 목적을 위해 만들어진다.

    $fp=fopen()
    while ($line = stream_get_line($fp, 1024 * 1024, "\n"))
    {
    echo $line;
    }
    fclose($fp);
    
  13. ==============================

    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;
    }
    
  14. from https://stackoverflow.com/questions/13246597/how-to-read-a-large-file-line-by-line by cc-by-sa and MIT license