>백엔드 개발 >PHP 튜토리얼 >메모리 제한을 초과하지 않고 거대한 문자열을 처리하는 방법은 무엇입니까?

메모리 제한을 초과하지 않고 거대한 문자열을 처리하는 방법은 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-11-13 06:37:021054검색

How to Process Huge Strings Without Exceeding Memory Limits?

메모리 제한을 초과하는 문자열 조작

3천만 문자 CSV 파일의 경우처럼 지나치게 큰 문자열을 처리할 때 메모리 할당 오류 발생할 수 있습니다. 이 문제를 해결하려면 전체 문자열을 메모리에 로드하지 마십시오. 대신, 메모리 제한을 초과하지 않고 데이터를 처리하기 위한 대체 전략을 사용하십시오.

대체 접근 방식:

  1. CURLOPT_FILE 활용: CURLOPT_FILE 활용 옵션을 CURL과 함께 사용하여 데이터를 기록해야 하는 대상 파일을 지정합니다. 이 접근 방식을 사용하면 메모리 제약을 피하면서 데이터를 파일에 직접 쓸 수 있습니다.
  2. 사용자 정의 스트림 래퍼 생성: 사용자 정의 스트림 래퍼를 생성하면 데이터가 도착할 때 메모리에서 데이터를 처리할 수 있습니다. 전체 문자열을 메모리에 저장하는 대신. 이 방법을 사용하면 데이터를 청크로 처리하여 메모리 소비를 줄일 수 있습니다.

Stream Wrapper를 사용한 구현 예:

class MyStream {
    protected $buffer;

    function stream_open($path, $mode, $options, &$opened_path) {
        // Has to be declared, it seems...
        return true;
    }

    public function stream_write($data) {
        $lines = explode("\n", $data);
        $lines[0] = $this->buffer . $lines[0];
        $nb_lines = count($lines);
        $this->buffer = $lines[$nb_lines-1];
        unset($lines[$nb_lines-1]);
        var_dump($lines); // Process data as needed
        echo '<hr />';
        return strlen($data);
    }
}

// Register custom stream
stream_wrapper_register("test", "MyStream");

// Configure curl with target "file"
$fp = fopen("test://MyTestVariableInMemory", "r+");
curl_setopt($ch, CURLOPT_FILE, $fp); // Data will be sent directly to stream

curl_exec($ch);
curl_close($ch); // Don't forget to close file / stream
fclose($fp);

이 전략을 사용하면 다음을 처리할 수 있습니다. 데이터가 도착하는 대로 점진적으로 처리하여 메모리 할당 문제를 방지합니다.

위 내용은 메모리 제한을 초과하지 않고 거대한 문자열을 처리하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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