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

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

ただいまの
回答率

91.00%

  • Python 3.x

    4095questions

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

  • Ubuntu

    1088questions

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

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

受付中

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 294

jun.k

score 18

平均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)

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+1

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

私が大規模なデータを扱うときに検討および実施するのは以下の方法になります。

前提

・concat後のdfはすべての行と列が結合状態で同時にメモリ上に展開していないとその後の行いたい処理ができないのか?
⇒ただ、基本的にすべてをメモリ上に展開していないとできない処理ってあんまりないきがします。

対策

・後続処理で活用しないカラムやレコードがあるならばdfから削除して結合する。
⇒特定列のみの結合や0やNanなどの消しても問題ないレコードがあるなら削除するなど。

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/01 14:23

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

    キャンセル

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通りの読み方でデータフレームを作った場合、その特徴を調べてみると消費量がそこそこ変わることがわかります。

import numpy as np
import pandas as pd

d1 = pd.read_csv('test.txt', dtype={'B': np.float32, 'C': np.int32, 'D': np.int8})
d2 = pd.read_csv('test.txt')

print('--- d1 ---')
print(d1.info())
print('--- d2 ---')
print(d2.info())

====>
--- d1 ---
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 10 entries, 0 to 9
Data columns (total 4 columns):
A    10 non-null object
B    10 non-null float32
C    10 non-null int32
D    10 non-null int8
dtypes: float32(1), int32(1), int8(1), object(1)
memory usage: 250.0+ bytes
None
--- d2 ---
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 10 entries, 0 to 9
Data columns (total 4 columns):
A    10 non-null object
B    10 non-null float64
C    10 non-null int64
D    10 non-null int64
dtypes: float64(1), int64(2), object(1)
memory usage: 400.0+ bytes
None

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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/01 16:07

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

    キャンセル

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

  • ただいまの回答率 91.00%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Python 3.x

    4095questions

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

  • Ubuntu

    1088questions

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