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

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

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

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

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

Q&A

2回答

5425閲覧

pandasのconcateについて(GBクラスのconcate)

jun.k

総合スコア28

Python 3.x

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

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

0グッド

0クリップ

投稿2017/11/01 03:39

平均2GB程度の14個のcsvファイル(時系列データ)をread_csvで呼び出して加工した後、各々縦方向に連結したいのですが、MemoryErrorとでて止まってしまいます。OSはubuntu、メモリは16×2=32GB、ハードは1TB,GPU搭載PCです。メモリはこれ以上増設できないのですが、他に対処法などご存知でしょうか。swapすればメモリを拡大できるという記事もみたのですが難しそうなので、他の方法があればと思い質問させていただいております。

コードは下記の通りです(上記手順で14個のDataFrameを作成(df0~df13)した後の処理)。

df14=pd.concat([df0,df1,df2],axis=0)
df15=pd.concat([df3,df4,df5],axis=0)
df16=pd.concat([df6,df7,df8],axis=0)
df17=pd.concat([df9,df10,df11],axis=0)
df18=pd.concat([df12,df13],axis=0)

df19=pd.concat([df14,df15],axis=0) ←ここでエラーが出ます
df20=pd.concat([df16,df17],axis=0)
df21=pd.concat([df18,df19],axis=0)
df22=pd.concat([df20,df21],axis=0)

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

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

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

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

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

guest

回答2

0

エラーを見る感じですと、やはりメモリ不足が原因なのだと思います。
物理的なメモリの増設や仮想メモリの確保が難しい場合、現状目的としている結合した結果を一度にメモリ上へ展開することは難しいと思います。(concatに比べてappendの方がマージコストない分メモリ消費が低いのでもしかしたら出来るかもしれませんが)
※df.info()などを活用して要求メモリの概算をだしてもいいかもしれません

私が大規模なデータを扱うときに検討および実施するのは以下の方法になります。
######前提
・concat後のdfはすべての行と列が結合状態で同時にメモリ上に展開していないとその後の行いたい処理ができないのか?
⇒ただ、基本的にすべてをメモリ上に展開していないとできない処理ってあんまりないきがします。
######対策
・後続処理で活用しないカラムやレコードがあるならばdfから削除して結合する。
⇒特定列のみの結合や0やNanなどの消しても問題ないレコードがあるなら削除するなど。

分割処理等の実装が可能という前提で対策を考えた場合。
列ごと、行ごとの処理が可能ならば処理可能な単位でDBやファイルへ保存を行い処理ごとに読み込むように実装する
・df.to_hdf('temp.h5', 'df')等を用いて中間結果をファイルへ書き出して処理ごとに処理するデータをファイルから読み込み実行を行う、またファイル上で結合を行う。

・DBを用いて中間結果を保存しながら処理を行う。処理ごとに処理するデータを取り出し処理を行う、またDB上で結合を行う。

投稿2017/11/01 05:11

nitoage

総合スコア98

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

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

jun.k

2017/11/01 05:23

ありがとうございます。やはりそうですか・・。ご丁寧にありがとうございます。appendも同様でした。 これらdfはすべての欠損等を処理した後のものなので、削除できるカラム等はないです。すべてを連結したデータファイルを後続のプログラムに渡す必要があるのですが、そのプログラムは外部業者が作成したものなので、1つだけになっている必要があります。このため無理にでも1つにまとめる必要があると思っています。ダメなら業者に仕様変更していただくのですが、なんとか負担ゼロでできないものかと試行錯誤しております。 swap領域確保を再検討します。
guest

0

回答ではないのですが、具体的な情報を追記されると具体体な回答が得られやすい気がするので・・・

今の質問内容から閲覧者に何がわかるかといえば以下の程度になります。

CSVのサイズが2GB程度で14個ある
それを全て縦方向に連結しようとしている
Linuxの搭載メモリーは32GBである

一つのデータフレームの具体的な大きさはCSVの中身によって多少変動すると思いますので、データフレームがどのようなものなのか(各列のデータ型や、列数、行数)を明記すると閲覧者にもより状況が分かり易くなると思います。そうなれば具体的な方法論もコメントしやすくなると思います。

例を挙げますと

A,B,C,D
A,1.1,10000,0
B,2.2,20000,0
C,3.3,30000,0
...データ行がトータルで10行(163 byte)

このようなデータ行が10行のCSVを2通りの読み方でデータフレームを作った場合、その特徴を調べてみると消費量がそこそこ変わることがわかります。

python

1import numpy as np 2import pandas as pd 3 4d1 = pd.read_csv('test.txt', dtype={'B': np.float32, 'C': np.int32, 'D': np.int8}) 5d2 = pd.read_csv('test.txt') 6 7print('--- d1 ---') 8print(d1.info()) 9print('--- d2 ---') 10print(d2.info()) 11 12====> 13--- d1 --- 14<class 'pandas.core.frame.DataFrame'> 15RangeIndex: 10 entries, 0 to 9 16Data columns (total 4 columns): 17A 10 non-null object 18B 10 non-null float32 19C 10 non-null int32 20D 10 non-null int8 21dtypes: float32(1), int32(1), int8(1), object(1) 22memory usage: 250.0+ bytes 23None 24--- d2 --- 25<class 'pandas.core.frame.DataFrame'> 26RangeIndex: 10 entries, 0 to 9 27Data columns (total 4 columns): 28A 10 non-null object 29B 10 non-null float64 30C 10 non-null int64 31D 10 non-null int64 32dtypes: float64(1), int64(2), object(1) 33memory usage: 400.0+ bytes 34None

データの特徴に応じて適切な型を選べばメモリーの節約になる例ですが、質問にどうやって読み込んだかが書いてないと、閲覧者からはあなたがd1のようにメモリーを節約する工夫をしているのか、d2のように素朴に読み込んだだけなのかがわかりません。

また連結の目的は全データに対する分析だと思いますが、それが全ての列を必要とするものなのかそうでないかといったことも閲覧者にはわかりません。

どんなデータをどういう目的でどういう手段で処理しようとしているか状況がよくわかるようになるべく詳しく書くのが質問の際のポイントではないでしょうか。

投稿2017/11/01 05:43

編集2017/11/01 05:45
KSwordOfHaste

総合スコア18394

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

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

jun.k

2017/11/01 07:07

申し訳ありません。そこまで考えが及びませんでした。以後気をつけます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問