2013-03-12 3 views
14

API에 부딪히며 JSON 파일 (많은 객체 배열)을 수신하여 로컬에 저장하는 cron 스크립트를 작성하고 있습니다. 완료되면 다른 스크립트는 다운로드 한 JSON 파일을 구문 분석하고 각 객체를 MySQL 데이터베이스에 삽입해야합니다.큰 JSON 파일을 구문 분석합니다.

나는 json_decode()과 함께 file_get_contents()을 사용 중입니다. 이렇게하면 처리하기 전에 전체 파일을 메모리로 읽으려고 시도합니다. 내 JSON 파일의 크기가 일반적으로 250MB-1GB + 이상인 경우를 제외하고는 괜찮습니다. 내 PHP 메모리 제한을 늘릴 수 있지만 그게 내 마음에 가장 큰 대답을하지 않는 것 알아요. 나는 줄 단위로 파일을 읽으려면 fopen()fgets()을 실행할 수 있지만 각 json 개체별로 파일을 읽어야한다는 것을 알고 있습니다.

개체 당 파일을 읽는 방법이 있습니까? 아니면 비슷한 접근 방법이 있습니까?

+2

이 [포스트] (http://stackoverflow.com/questions/4049428/processing-large-json-files-in-php) 당신을 도울 수 ... –

+0

가 왜 JSON이 너무 커서 파일입니까? –

+4

좋은 슬픔! API 호출에서 1gig 응답 ?? 그건 미친 짓이야. 개발자는 페이지 매김의 개념에 대해 절대 듣지 못했습니까? – Spudley

답변

4

이것은 실제로 json 파일의 내용에 따라 다릅니다.

파일을 메모리에 여는 것은 옵션이 아닙니다. 사용자가 사용하지 않은 유일한 옵션은 fopen/fgets입니다.

줄마다 한 줄씩 읽을 수 있으며 이러한 json 개체의 구조가 일관되면 파일의 json 개체가 시작되어 끝날 때 쉽게 감지 할 수 있습니다.

일단 전체 개체를 수집하면이를 db에 삽입 한 다음 다음 개체로 이동합니다.

더 이상은 없습니다. json 객체의 시작과 끝을 감지하는 알고리즘은 데이터 소스에 따라 복잡해질 수 있지만, 나는 훨씬 복잡한 구조 (XML)를 사용하기 전에 이와 같은 작업을 수행했다.

+0

구조는 매우 기본이며, 1 개의 큰 객체 배열, 각 객체는 동일한 3 개의 속성을가집니다. 나는'fgets()'을 할 것이라고 가정하고, 그 개별 문자열을 파싱하여 그 안에있는 모든 JSON 객체를 찾아 데이터베이스에 삽입한다. 그런 다음 포인터를 마지막으로 성공적으로 찾은 JSON 객체의 끝으로 재설정하고 반복합니다. 그게 네 생각이야? –

+0

정확합니다. 파일의 크기가 매우 다양하므로 (200MB에서 1GB 등) 파일 크기에 관계없이 작동하는 방법을 사용하는 것이 가장 좋습니다. – Kovo

3

최적의 솔루션 :

사용 구분 어떤 종류의 (등 매김, 타임 스탬프, 오브젝트 ID) 여러 요청을 통해 작은 청크에서 데이터를 읽을 수 있습니다. 이 솔루션은 이러한 JSON 파일 생성 방법에 대한 일종의 제어 기능이 있다고 가정합니다. 이 사실을 제외하고 괜찮을 것

JSON 파일 것이다 2백50메가바이트-1기가바이트 +에서 일반적으로 범위 : 나는 내 가정을 근거로하고있다.

1GB의 JSON 데이터를 읽고 처리하는 것은 간단합니다. 더 나은 접근 방법이 가장 필요합니다. JSON 데이터의 큰 ammounts 작업 할 때 그것을 필요로하지만, 비효율적이다 -

7

https://github.com/shevron/ext-jsonreader

PHP와 함께 제공되는 기존의 내선/JSON 매우 편리하고 사용하기 간단이 LIB 시도을 전체 메모리 (예 : file_get_contents() 사용)에서 읽은 다음 을 즉시 PHP 변수로 변환합니다. 큰 데이터 세트의 경우이 값은 많은 메모리를 차지합니다 ( ).

JSONReader는 스트림에서 작동하며 은 전체 데이터를 메모리에로드하지 않고도 PHP 스트림에서 JSON 데이터를 읽을 수 있습니다.또한 개발자는 모든 데이터를 디코딩 및로드하지 않고도 메모리에 JSON 스트림의 특정 값을 추출 할 수 있습니다.

관련 문제