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

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

新規登録して質問してみよう
ただいま回答率
85.48%
シリアライゼーション

シリアライゼーションとはデータ構造を特定のフォーマットに変換するプロセスのことです。これはデータの保存・送信・もしくは後々の再構築を容易にするために行われます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

zip

ZIPとは、複数のファイルをひとつにまとめて圧縮したり、圧縮したファイルを展開することができるアーカイブフォーマットです。 1998年以降のWindowsOS各バージョンで、標準の圧縮フォルダとして採用されています。 MacOSでも、X v10.3以降に他の圧縮ソフトとまとめてZIP機能を採用しています。

Q&A

解決済

1回答

426閲覧

メモリに乗らない大きなデータの扱い方について

mn.py

総合スコア41

シリアライゼーション

シリアライゼーションとはデータ構造を特定のフォーマットに変換するプロセスのことです。これはデータの保存・送信・もしくは後々の再構築を容易にするために行われます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

zip

ZIPとは、複数のファイルをひとつにまとめて圧縮したり、圧縮したファイルを展開することができるアーカイブフォーマットです。 1998年以降のWindowsOS各バージョンで、標準の圧縮フォルダとして採用されています。 MacOSでも、X v10.3以降に他の圧縮ソフトとまとめてZIP機能を採用しています。

0グッド

1クリップ

投稿2022/06/16 13:08

メモリに乗らないデータの出力方法

現状

非常に大きなデータが入った辞書があります。
これまでは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)

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

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

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

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

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

mn.py

2022/06/16 13:21

小さいデータで試しているのですが、サイズはかなり圧縮されましたが、書き込みはむしろ遅くなっています。。 メモリなどの知識がないので、そもそもこの考え方があっているのかわからないです。
bsdfan

2022/06/16 13:37

実際のデータの大きさや、やりたいこと次第で、取れる方法が変わりそうですが、 とりあえずpickle.dumps(data)でbytesを生成してからそれをファイルに書き込んでいるのを、 gzip.open()したファイルに直接pickle.dump(data, fp)するようにした方が、メモリの消費は少ないはず。
mn.py

2022/06/16 15:12

ありがとうございます。元は5.5G程のjsonのデータですが、そのデータを元にして計算処理したものを辞書にして出力しようとしています。辞書の大きさはわからないのですが、おそらく6G程度のファイルになって出力されると思います。
TakaiY

2022/06/17 02:48

困っていることが何なのかよくわかりません。 「辞書があります」ということなので、すでに計算終った結果がpythonの辞書としてメモリ上に載っているのかと思ったのですが、そうでえはなさそうですね? とすると、「何時間待っても出力されません」という状況はどのような状況ですか? データは 読み込めている? いない? (Swapに入っているのかな?)
mn.py

2022/06/17 05:10

ありがとうございます。わかりにくくてすみませんでした。デバッグしてみたら、どうやら元のjsonファイル(5G)がちゃんと読み込めていなかったようです、、、、。元ファイル作成のとこをから見直さないとダメですね(~_~;)
guest

回答1

0

ベストアンサー

辞書データ生成をジェネレータにできるならメモリ使用量を激減できますよ。
jsonにするとメモリ消費してしまうので、1行毎に出力する処理にする必要があります。

投稿2022/06/16 13:16

shiracamus

総合スコア5406

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

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

mn.py

2022/06/16 15:15

辞書データ生成をジェネレータに、、ちょっと全くわからないので調べてみます! 入力データはjsonです!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問