質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

9672閲覧

巨大なjsonファイルをloadする際について

PythonGood

総合スコア13

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2018/08/09 22:40

編集2018/08/09 22:46

巨大なサイズのjsonファイルを

Python

1with open("need_data/raw_dict.json") as f: 2 lines = json.load(f)

でロードしようとすると、エラーが発生致します。
[Errno 22] Invalid argument

また、

Python

1 2with open("need_data/raw_dict.json") as f: 3 lines = f.readlines()

でロードをするとlinesに配列が入り、その中身が辞書型でなく、文字列になります。

巨大なjsonファイルをロードした際に、中身が辞書型、シリアライズした時の型のままロードする方法はありますでしょうか。

分かる方、よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

umyu

2018/08/09 23:00

巨大なサイズとは具体的にどれぐらいのサイズですか?
PythonGood

2018/08/09 23:00

3G以上のファイルです。
guest

回答1

0

ベストアンサー

3G以上のファイルです。

DOMじゃなくてSAXベースのjsonパーサーを使うとよいのでは。
「python json sax parser」でググるとこれがHITしました。
json-streamer

仕様変更できるのであれば。
・処理対象のJSONのファイルサイズを減らす。
・JSON形式以外のデータ構造にする。
・JSONの項目を可逆圧縮する。ライブラリがありそうな気がします。

大人の事情があると思いますが、INメモリで3GBのデータを扱うのはどうかと思います。。。


◇追記

with open("need_data/raw_dict.json") as f:
lines = f.readlines()
でロードをするとlinesに配列が入り、

この記述が気になったので調べました。
OSError: [Errno 22] when I try to .read() a json file

It appears that this is some kind of bug that occurs when the file is too large (my file was ~10GB). Once I use split to break up the file by 200 k lines, the .read() error goes away. This is true even if the file is not in strict json format.

メモリ不足以外に不正なJSON形式でもInvalid argumentの例外が発生するとのことです。
不正確な回答申し訳ないです。

投稿2018/08/09 23:09

編集2018/08/10 00:25
umyu

総合スコア5846

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

umyu

2018/08/09 23:17

@tachikomaさんへ 情報ありがとうございます。ドキュメントを見る限りでは似たような感じですね。
PythonGood

2018/08/13 22:50

お二方、情報ありがとうございます。 json-streamer, ijson 参考にさせていただきます。 また、不正なJSON形式ですが、 with open("need_data/raw_dict.json") as f: lines = f.readlines() で読み込める、また、JSONを作成するときに他のJSONも同様に作成し、 サイズの小さいJSONは読み込めるので、不正なJSON形式ではないと思われます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問