🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python 3.x

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

Q&A

解決済

1回答

2953閲覧

pythonで省メモリなlistを作りたい

AIthon

総合スコア76

Python 3.x

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

0グッド

0クリップ

投稿2019/12/23 07:50

pythonで、

python

1name = 'ファイルまでのパス' 2with open(name, 'rb') as f: # ファイルをバイナリモードで読み込む 3 while True: 4 bait = f.read(1) # ファイルを1バイトづつ読み込み、baitに代入する 5 if bait: 6 bait = str(bin(ord(bait))) # baitを二進数表記(例:0b1101等)に変換 7 bait = bait[2:] # baitの先頭2文字(0b)を削除 8 zero_comp = 8 - len(bait) 9 while zero_comp > 0: # baitのサイズを1バイト(8ビット)にする 10 bait = '0' + bait 11 zero_comp = zero_comp - 1 12 small_bin = list(bait) # baitを1文字づつsmall_binに代入する 13 x_arr.append(small_bin) # x_arrにsmall_binを代入する 14 else: 15 break

というようなコードを書いてファイルのデータをlist型の変数(ここではx_arr)に代入しています。
しかし、このコードだと数MBほどしかないファイルデータを代入するだけで
x_arrが数GBものメモリを消費してしまいます。
listのメモリ使用量を抑える方法があれば教えてほしいです。
わかりにくい質問ですみません。

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

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

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

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

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

tiitoi

2019/12/23 07:52

バイナリデータをなぜわざわざ2進の文字列表記にしているのでしょうか?
AIthon

2019/12/23 07:54

データ圧縮に興味があり、自分で圧縮プログラムを作りたかったからです。データを処理するときに2進数のほうが処理しやすいと考えたからです。
guest

回答1

0

ベストアンサー

データ圧縮に興味があり、自分で圧縮プログラムを作りたかったからです。データを処理するときに2進数のほうが処理しやすいと考えたからです。

2進表記の文字列にする必要はないと思います。
read() で bytes データとして読み込んで、圧縮などなにか処理したい場合も bytes データに対して直接操作するべきだと思います。
こうすれば、ファイルとほぼ同じメモリしか必要としません。

python

1with open(filepath, 'rb') as f: 2 data = f.read() 3 4# data を使ってなにかする。

投稿2019/12/23 08:05

tiitoi

総合スコア21956

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

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

AIthon

2019/12/23 08:35

なるほど、回答ありがとうございます。 メモリ上に全てのデータを移すのは自分の作ろうとしているプログラムの都合上2進データを数100~数1000回ほど使うのでいちいち読み込むのはPCに負担がかかると考えたからです。説明不足で申し訳ありません。
tiitoi

2019/12/23 08:49

「データ圧縮」とあったので、zip のようにファイルを圧縮する処理を書きたいと理解していますが、それでよろしかったでしょうか。 コンピューターで扱うデータはデジタルデータなので、ビット演算で2進として扱えるので、2進表記文字に変換する必要はないです。 読み込むファイルが数百MB程度ならそのまま全部読み込んでしまっても、昨今のメモリ容量であれば問題ないでしょうし、数GBとか一度に読み込むと問題があるようであれば、f.read(適当なバイト数) で少しずつ読み込んで処理してHDDに出力するというのを繰り返せばいいと思います。 質問でメモリ量が増えてしまっている問題はデータを文字列にしてしまっている点です。 例えば、int64 型の整数を表すのは8バイトで済みますが、これを2進表記の文字列にした場合、64個の0/1の文字分のメモリが必要になるので、かなり冗長になります。
AIthon

2019/12/25 09:20

遅くなって申し訳ありません。0,1を文字列としてリストに代入していることに気づいていませんでした。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問