2016-08-10 3 views
0

node.jsスクリプトに巨大なjsonファイル(550MB)を含めるにはどうすればいいですか?node.jsスクリプトに巨大なjsonを含める最も良い方法は何ですか?

は、私が試した:

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

2つのこと:.JSONのサイズが問題であるかどうかを確認するために小さなデータセットで実行しようとしましたか?そうでない場合は、エラーに関連するコードを投稿できますか? – Edon

+0

JSONが有効でない可能性がありますか? –

+0

ええと、一般的には重いXMLの500メガバイトで動作する準備ができているパーサーはどれくらいあるのでしょうか。 JSONの500メガバイトはかなりです。 – vlaz

答えて

2

エラー:

は、スクリプトが増加--max-古い空間-sizeパラメータで実行された
var json = require('./huge-data-set.json') 

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

それで失敗しました大きすぎる(単一の)文字列を作成しようとしているために発生します。

いくつかの可能な解決策:

  • あなたのデータはで配列されている場合は、代わりに一度
  • 時にメモリにすべてをロードする必要があるとして、異なるバッキングストア(たとえばsqliteのデシベル)とクエリデータを使用します最上位レベルでは、各配列要素を別々の行に置くことをお勧めします。行をバッファリングして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要素

の最大長までゼロ以上 16ビット符号なし整数値(「要素」)の全ての順序付けられたシーケンスのセットであります

これは、メモリ不足の制限ではなく、文字列が文字列型のバイトサイズよりも大きいために操作が失敗したことを意味します。

jsonオブジェクトをfsから読み込むのではなくjavascriptで書き込もうとすると、そのような場合が起きないように制限が設定されているため、メモリ不足例外が発生します。

+0

この回答は、@ Paulproからのコメントが同じ問題を解決するのに役立つ一方、問題の理解を深める上で役立ちます – comiventor

関連する問題