2016-08-10 3 views
0

거대한 json 파일 (550MB)을 node.js 스크립트에 포함시키는 방법은 무엇입니까?거대한 json을 node.js 스크립트에 포함시키는 가장 좋은 방법은 무엇입니까?

내가 시도 :

buffer.js:500 
    throw new Error('"toString()" failed'); 
    ^

Error: "toString()" failed 
    at Buffer.toString (buffer.js:500:11) 
    at Object.fs.readFileSync (fs.js:552:33) 
    at Object.Module._extensions..json (module.js:556:20) 
+2

두 가지 : 작은 데이터 세트로 실행하여 .JSON의 크기가 문제인지 확인해 보셨습니까? 그렇지 않은 경우 오류와 관련된 코드를 게시 할 수 있습니까? – Edon

+0

JSON이 유효하지 않을 수 있습니까? –

+0

어, 나는 얼마나 많은 파서가 500 메가의 XML로 작업 할 준비가되어 있는지 모르겠다. 이것은 일반적으로 더 무겁다. 500 메가의 JSON이 꽤 많이 있습니다. – vlaz

답변

2

오류 :

는 스크립트가 증가 --max 된 공간 크기 매개 변수를 사용하여 실행 된
var json = require('./huge-data-set.json') 

node --max-old-space-size=4096 diff.js 

이 실패했습니다 너무 큰 (단일) 문자열을 만들려고하기 때문에 발생합니다.

몇 가지 가능한 솔루션 : 데이터가 배열이에있는 경우 당신이 필요로하는 대신 한 번에 메모리에

  • 를 모두로드로

    • 다른 백업 저장소 (예를 들어, SQLite는 DB) 및 쿼리 데이터를 사용 최상위 수준에서는 각 배열 요소를 별도의 줄에 두는 것이 좋습니다. 그러면 줄을 버퍼링하고 JSON.parse()을 버퍼링 한 다음 다음 줄로 계속 진행할 수 있습니다. 그러나 구문 분석 된 JavaScript 값이 너무 많은 공간을 차지하면 메모리/GC 문제가 발생할 수 있습니다.
  • +0

    문자열의 기본 제한을 늘리는 방법은 없습니까? 과거에는 성공적으로 약 250MB 파일을로드했습니다. – user1276919

    +0

    @ user1276919 JSON이 큰 데이터 저장소로 사용되지는 않는다고 생각합니다. 나는 당신이 다른 기계에서 작동하도록 고투 할 것이기 때문에 모든 종류의 한계를 수정하지 말 것을 제안한다. Node.js의 업데이트조차 당신이 그 일을 너무 많이 조정하면 스크립트를 깨뜨릴 수 있습니다. –

    5

    Behind Node는 JS 구현을 구현하는 v8 엔진입니다. V8은 C++로 쓰여졌 고 결과적으로 문자열에 문자를 저장하기 위해 타입을 사용합니다 (여기에주의를 기울여 사용합니다).

    ECMA에서 지정한대로 JavaScript는 모든 문자를 2 바이트 (utf16로 인코딩 됨)로 저장합니다.

    문자열 유형 2^53-1 요소

    최대 길이까지 0 이상의 16 비트 부호없는 정수 값 ("요소")의 모든 명령 시퀀스의 집합 인

    그래서 겪고있는 것은 메모리 부족 현상이 아니라 문자열이 문자열 유형의 바이트 크기보다 커서 작업이 실패한 것입니다.

    json 개체를 자바 스크립트로 작성하는 대신 fs (필요에 따라)에서 읽으려는 경우 이러한 예외가 발생하지 않도록 제한이 설정되어 있으므로 메모리 부족 예외가 발생합니다.

    +0

    이 답변은 문제에 대한 이해를 높이는 데 도움이되지만 @Paulpro의 의견은 문제 해결에 도움이됩니다. – comiventor

    관련 문제