>백엔드 개발 >PHP 튜토리얼 >메모리 문제 없이 PHP에서 대용량 JSON 파일을 효율적으로 처리하려면 어떻게 해야 합니까?

메모리 문제 없이 PHP에서 대용량 JSON 파일을 효율적으로 처리하려면 어떻게 해야 합니까?

Linda Hamilton
Linda Hamilton원래의
2024-12-14 15:00:17253검색

How Can I Efficiently Process Large JSON Files in PHP Without Memory Issues?

PHP에서 대용량 JSON 파일 처리

대량 JSON 파일을 처리하는 것은 어려울 수 있으며, 특히 크기가 200M를 초과하는 대용량 파일을 처리할 때 더욱 그렇습니다. . 이 문제를 해결하려면 전체 파일을 메모리에 로드하지 않는 것이 중요합니다. 대신 전체 콘텐츠를 버퍼링하지 않고 개체를 개별적으로 처리하는 스트리밍 접근 방식을 권장합니다.

효과적인 솔루션 중 하나는 PHP 7용 pcrov/JsonReader와 같은 스트리밍 JSON 풀 파서를 활용하는 것입니다. 이 파서는 이벤트와 다른 접근 방식을 따릅니다. 파서에서 메서드를 호출하여 명시적으로 데이터를 요청할 수 있도록 하는 기반 파서입니다. 이는 구문 분석 프로세스에 대한 더 큰 유연성과 제어를 제공합니다.

예 1: 개체를 전체 엔터티로 읽기

이 예는 JSON 파일에서 개체를 완전한 개체로 추출하는 방법을 보여줍니다. 배열:

use pcrov\JsonReader\JsonReader;

$reader = new JsonReader();
$reader->open("data.json");

$reader->read(); // Outer array.
$depth = $reader->depth(); // Check in a moment to break when the array is done.
$reader->read(); // Step to the first object.
do {
    print_r($reader->value()); // Do your thing.
} while ($reader->next() && $reader->depth() > $depth); // Read each sibling.

$reader->close();

예 2: 명명된 개인 읽기 요소

각 개체에서 특정 요소를 추출하기 위해 이 예에서는 다음을 보여줍니다.

$reader = new pcrov\JsonReader\JsonReader();
$reader->open("data.json");

while ($reader->read()) {
    $name = $reader->name();
    if ($name !== null) {
        echo "$name: {$reader->value()}\n";
    }
}

$reader->close();

예 3: 이름으로 속성 필터링

이 마지막 예는 동일한 이름 내에 중복된 이름이 있는 경우에도 특정 이름으로 속성을 필터링하는 방법을 보여줍니다. object:

$json = <<<JSON
[
    {"property":"value", "property2":"value2"},
    {"foo":"foo", "foo":"bar"},
    {"prop":"val"},
    {"foo":"baz"},
    {"foo":"quux"}
]
JSON;

$reader = new pcrov\JsonReader\JsonReader();
$reader->json($json);

while ($reader->read("foo")) {
    echo "{$reader->name()}: {$reader->value()}\n";
}

$reader->close();

대용량 JSON 파일을 처리하기 위한 최적의 접근 방식은 데이터 구조와 의도한 작업에 따라 달라집니다. 그러나 스트리밍 JSON 파서를 활용하면 개발자는 메모리 문제 없이 대용량 JSON 파일을 효율적으로 처리할 수 있습니다.

위 내용은 메모리 문제 없이 PHP에서 대용량 JSON 파일을 효율적으로 처리하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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