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

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

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

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Q&A

3回答

1570閲覧

pythonでのeval関数による大容量ファイルの読み込み

milco

総合スコア20

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

0グッド

0クリップ

投稿2016/07/05 10:03

編集2016/07/07 00:39

以下のような配列が記述されているファイルをpythonのeval関数を用いて読み込み、計算などの処理を行っているのですが、読み込むファイルの容量が100~200MBとかなり大きく、eval関数による処理の際メモリの使用率が100パーセント近くまで増加し、処理が遅くなってしまい困っています。
何か代替策は無いでしょうか?よろしくお願いします。

#プログラム例
f=open(data.txt)
data = f.read()
data2 = eval(data2)
print data2
#ファイル例(data.txt)
numpy.array[1,2,3,4,...]
numpy.array[5,6,7,8,...]
.
.
.
numpy.array[9,10,11,12,...]

膨大なファイルをeval関数に入れることによりメモリを消費してしまっているようなのですが、readline関数等を使えば1行ずつにdata2に追加していくように書き換えることは可能でしょうか?

data.txtは以下のような形式です。
"""
[
[numpy.array[0,0,0,0,0.421,0,0…,0,0],numpy.array[1]],
[numpy.array[0,0,0…,0,0,0.928…,0,0],numpy.array[0]],



[numpy.array[0,0.428,0…,0,0,0,…,0,0.007],numpy.array[1]]
[numpy.array[0,0.428,0…,0.311,0,0,…,0,0],numpy.array[0]]
]
"""

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

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

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

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

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

lightson

2016/07/05 11:59

data.txtの中身を”””で囲った文字列で書いてもらえますか? また、data2として何がほしいのかも知りたいです。
milco

2016/07/07 00:33

ファイル例とほぼ同様の形式ですが、 """ [ [numpy.array[0,0,0,0,0.421,0,0…,0,0],numpy.array[1]], [numpy.array[0,0,0…,0,0,0.928…,0,0],numpy.array[0]], ・ ・ ・ [numpy.array[0,0.428,0…,0.311,0,0,…,0,0],numpy.array[0]] ] """ このように各行に2つの配列が格納されており、左側の配列が一定区間毎の確率分布(要素数15000)を表し、右側の配列はその確率分布が属するクラス(0か1)を表しています。 このファイルの様式、データ構造のままdata2へ引き渡したいのですが、eval()を使わなければ配列内の数値が文字列として扱われてしまうためeval()によるファイルの評価を行っています。
milco

2016/07/07 00:40

data.txtの中身が見辛くなってしまったため、質問本文の方に追加しました。
lightson

2016/07/07 13:16

このような形式のデータはあまり見たことがないのですが、numpy.arrayという文字を含む文字列という理解でよろしいでしょうか?
guest

回答3

0

全体を一気に eval に与えているということは、
ファイル内容全体で一つのオブジェクトとして
記述されているということでしょうか。

1行を1アイテムに相当するように書き直して、
プログラムからは1行読んで eval で変換して
data2 に追加するような形でいけそうな感じがします。

投稿2016/07/05 10:48

takasima20

総合スコア7458

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

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

0

中身だけ書いたら単なる csv ですよね?
書き直したら csv.reader が使えるんじゃないですか?
普通にやったらたったの 200MB でひいひい言うなんてことはないはずなので eval が原因だと思います。

投稿2016/07/05 10:29

Zuishin

総合スコア28660

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

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

0

以下ではないですか?

python

1data2 = eval(data)

data.txtはどんな内容でしょうか?
数式が沢山入ってるなら bc コマンドに食わせたほうが軽いと思います。

投稿2016/07/05 10:10

moonphase

総合スコア6621

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

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

milco

2016/07/05 10:17

data.txtの中身はファイル例のようなただの数値の並んだ配列なのですが、その要素数が10000個以上と非常に多いため、eval(data)を行う際にメモリ消費量が増大してしまうようです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問