本当に大きなJSONファイルをRにロードしようとしています。ファイルが大きすぎてマシンのメモリに収まらないので、jsonlite
パッケージのstream_in
/stream_out
関数は本当に役に立ちます。これらの関数を使用して、データをロードせずにチャンク単位で最初にサブセット化し、サブセットデータを新しい小さなJSONファイルに書き込んでから、そのファイルをdata.frame
としてロードできます。しかし、この中間のJSONファイルは、stream_out
と書かれている間に切り捨てられています(適切な場合)。今私は詳細を説明しようとします。あなたが見ることができるように、私は一時的に接続を開くR:jsonliteのstream_out関数が不完全な/切り捨てられたJSONファイルを生成する
con_out <- file(tmp <- tempfile(), open = "wb")
stream_in(file("C:/User/myFile.json"), handler = function(df){
df <- df[which(df$Var > 0), ]
stream_out(df, con_out, pagesize = 1000)
}, pagesize = 5000)
myData <- stream_in(file(tmp))
:
が、私はこのように私のコードを書かれている(ドキュメントの例以下):私がしようとしています
私の元のJSONファイルstream_in
を読んで、handler
の機能をデータの各チャンクのサブセットにして、それを接続に書き込んでください。
問題
私はエラーが表示されたときにmyData <- stream_in(file(tmp))
、それを読もうとするまで、この手順は、何の問題もなく動作します。新しい一時的なJSONファイルを手動で開くと、一番下の行が常に不完全であることがわかります。次のようなものがあります。
{"Var1":"some data","Var2":3,"Var3":"some othe
このファイルを最後に手動で削除してから、問題なくファイルを読み込む必要があります。
ソリューション私は徹底的に文書を読み、stream_out
機能を見てみました
を試してみた、と私は、この問題を引き起こす可能性のあるものを把握することはできません。私が持っている唯一の手がかりは、完了時に
stream_out
関数が自動的に接続を閉じるため、他のコンポーネントがまだ書いている間に接続を終了している可能性があります。Iは、中間
data.frame
の問題を除外するためにhandler
関数内のすべてのチャンクでdata.frame
のtail()
端を印刷する印刷機能を挿入します。data.frame
はあらゆる間隔で完璧に生成されており、data.frame
の最後の2〜3行がファイルに書き込まれている間に切り捨てられていることがわかります(書き込まれていません)。それは、全体がdata.frame
(stream_out
の後にrbind
になっている)の最後が切れていることに注目してください。非常に大きな数字、数字、および
Inf
を試してみるなど、pagesize
引数で試してみました。何も働いていません。元のJSONファイルはストリーミングせずに読み取ることが大きすぎると、それは縮小さ(?)/ndjson
形式に実際にあるので私は
fromJSON
ようjsonlite
の他の機能を使用することはできません。
私は、Windows 7のx64上でR 3.3.3のx64を実行しているシステム情報
。 6 GBのRAM、AMD Athlon II 4コア2.6 GHz
治療
不便などである、私はまだ手動でJSONファイルを開くと、それらを修正することにより、この問題に対処することができますが、それはいくつかのデータの損失につながるだし、私のスクリプトを自動化できるようにすることではないですプロジェクト全体を通して繰り返し実行する必要があります。
本当にありがとうございます。ありがとうございました。
(〜トピック外ですが〜関連) Apache Drill-drill.apache.orgをチェックしてください。これはストリーミングJSON(ndjson)をうまく処理し、 'sergeant'パッケージを使用してdplyrを使用することができます。 – hrbrmstr
ありがとう、hrbrmstr!私はそれをチェックし、成功すれば報告します。 –