メモリに乗らないデータの出力方法
現状
非常に大きなデータが入った辞書があります。
これまではjsonに出力していたのですが、今回扱うデータが大きすぎるのか何時間待っても出力されません。
教えて頂きたい事
①辞書をファイルに出力する前にデータを圧縮して出力したらいいのではないか?と安直に考え下記の様にやってみましたが、考え方として合っているのかどうかいまいち分かりません。この考え方の方向性は合っていますでしょうか?(以下のdataはデータのイメージです)
②辞書を作成する時点でデータを圧縮するなど、他の方法があるのであれば教えて頂きたいです。
python
1data={'1993-04-02': [ 2{'aa': [[0, 0, 0, 0],[0, 0, 0, 0],[0, 0, 0, 0],[0, 0, 0, 0]], 3'label': 0,'bb': '44','date': '1993-04-02'}, 4{'aa': [[0, 0, 0, 0],[0, 0, 0, 0],[0, 0, 0, 0],[0, 0, 0, 0]], 5'label': 1,'bb': '25','date': '1993-04-02'}, 6{'aa': [[0, 0, 0, 0],[0, 0, 0, 0],[0, 0, 0, 0],[0, 0, 0, 0]], 7'label': 2,'bb': '28','date': '1993-04-02'}, 8{'aa': [[0, 0, 0, 0],[0, 0, 0, 0],[0, 0, 0, 0],[0, 0, 0, 0]], 9'label': 3,'bb': '12','date': '1993-04-02'}], 10'2003-05-01':[ 11{'aa': [[0, 0, 0, 0],[0, 0, 0, 0],[0, 0, 0, 0],[0, 0, 0, 0]], 12'label': 4,'bb': '44','date': '2003-05-01'}, 13{'aa': [[0, 0, 0, 0],[0, 0, 0, 0],[0, 0, 0, 0],[0, 0, 0, 0]], 14'label': 5,'bb': '25','date': '2003-05-01'}, 15{'aa': [[0, 0, 0, 0],[0, 0, 0, 0],[0, 0, 0, 0],[0, 0, 0, 0]], 16'label': 6,'bb': '28','date': '2003-05-01'}, 17{'aa': [[0, 0, 0, 0],[0, 0, 0, 0],[0, 0, 0, 0],[0, 0, 0, 0]], 18'label': 7,'bb': '12','date': '2003-05-01'}]} 19 20import gzip 21import pickle 22dat = pickle.dumps(data) 23print(dat) 24with gzip.open('dict.pickle.gz', mode='wb') as fp: 25 fp.write(dat)
小さいデータで試しているのですが、サイズはかなり圧縮されましたが、書き込みはむしろ遅くなっています。。
メモリなどの知識がないので、そもそもこの考え方があっているのかわからないです。
実際のデータの大きさや、やりたいこと次第で、取れる方法が変わりそうですが、
とりあえずpickle.dumps(data)でbytesを生成してからそれをファイルに書き込んでいるのを、
gzip.open()したファイルに直接pickle.dump(data, fp)するようにした方が、メモリの消費は少ないはず。
ありがとうございます。元は5.5G程のjsonのデータですが、そのデータを元にして計算処理したものを辞書にして出力しようとしています。辞書の大きさはわからないのですが、おそらく6G程度のファイルになって出力されると思います。
困っていることが何なのかよくわかりません。
「辞書があります」ということなので、すでに計算終った結果がpythonの辞書としてメモリ上に載っているのかと思ったのですが、そうでえはなさそうですね?
とすると、「何時間待っても出力されません」という状況はどのような状況ですか?
データは 読み込めている? いない?
(Swapに入っているのかな?)
ありがとうございます。わかりにくくてすみませんでした。デバッグしてみたら、どうやら元のjsonファイル(5G)がちゃんと読み込めていなかったようです、、、、。元ファイル作成のとこをから見直さないとダメですね(~_~;)
回答1件
あなたの回答
tips
プレビュー