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

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

ただいまの
回答率

87.34%

Memory error? allocateできない?

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 7,309

score 63

前提・実現したいこと

アンケートベースのデータをクレンジングしています。
順調にフラグ立てをしていたのですが、
突然以下のエラーが起きました。

発生している問題・エラーメッセージ

MemoryError                               Traceback (most recent call last)
<ipython-input-42-a99ba76878b8> in <module>
      5         return 0
      6 
----> 7 data['shampoo13'] = data.apply(lambda row:shampoo13(row), axis=1)

c:\users\jupyter-notebook\lib\site-packages\pandas\core\frame.py in apply(self, func, axis, broadcast, raw, reduce, result_type, args, **kwds)
   6904             kwds=kwds,
   6905         )
-> 6906         return op.get_result()
   6907 
   6908     def applymap(self, func):

c:\users\jupyter-notebook\lib\site-packages\pandas\core\apply.py in get_result(self)
    184             return self.apply_raw()
    185 
--> 186         return self.apply_standard()
    187 
    188     def apply_empty_result(self):

c:\users\jupyter-notebook\lib\site-packages\pandas\core\apply.py in apply_standard(self)
    290 
    291         # compute the result using the series generator
--> 292         self.apply_series_generator()
    293 
    294         # wrap results

c:\users\jupyter-notebook\lib\site-packages\pandas\core\apply.py in apply_series_generator(self)
    296 
    297     def apply_series_generator(self):
--> 298         series_gen = self.series_generator
    299         res_index = self.result_index
    300 

c:\users\jupyter-notebook\lib\site-packages\pandas\core\apply.py in series_generator(self)
    399         return (
    400             constructor(arr, index=self.columns, name=name)
--> 401             for i, (arr, name) in enumerate(zip(self.values, self.index))
    402         )
    403 

pandas\_libs\properties.pyx in pandas._libs.properties.CachedProperty.__get__()

c:\users\jupyter-notebook\lib\site-packages\pandas\core\apply.py in values(self)
    132     @cache_readonly
    133     def values(self):
--> 134         return self.obj.values
    135 
    136     @cache_readonly

c:\users\jupyter-notebook\lib\site-packages\pandas\core\generic.py in values(self)
   5441                ['monkey', nan, None]], dtype=object)
   5442         """
-> 5443         self._consolidate_inplace()
   5444         return self._data.as_array(transpose=self._AXIS_REVERSED)
   5445 

c:\users\jupyter-notebook\lib\site-packages\pandas\core\generic.py in _consolidate_inplace(self)
   5251             self._data = self._data.consolidate()
   5252 
-> 5253         self._protect_consolidate(f)
   5254 
   5255     def _consolidate(self, inplace=False):

c:\users\jupyter-notebook\lib\site-packages\pandas\core\generic.py in _protect_consolidate(self, f)
   5240         """
   5241         blocks_before = len(self._data.blocks)
-> 5242         result = f()
   5243         if len(self._data.blocks) != blocks_before:
   5244             self._clear_item_cache()

c:\usersjupyter-notebook\lib\site-packages\pandas\core\generic.py in f()
   5249 
   5250         def f():
-> 5251             self._data = self._data.consolidate()
   5252 
   5253         self._protect_consolidate(f)

c:\users\jupyter-notebook\lib\site-packages\pandas\core\internals\managers.py in consolidate(self)
    929         bm = self.__class__(self.blocks, self.axes)
    930         bm._is_consolidated = False
--> 931         bm._consolidate_inplace()
    932         return bm
    933 

c:\users\jupyter-notebook\lib\site-packages\pandas\core\internals\managers.py in _consolidate_inplace(self)
    934     def _consolidate_inplace(self):
    935         if not self.is_consolidated():
--> 936             self.blocks = tuple(_consolidate(self.blocks))
    937             self._is_consolidated = True
    938             self._known_consolidated = True

c:\users\jupyter-notebook\lib\site-packages\pandas\core\internals\managers.py in _consolidate(blocks)
   1910     for (_can_consolidate, dtype), group_blocks in grouper:
   1911         merged_blocks = _merge_blocks(
-> 1912             list(group_blocks), dtype=dtype, _can_consolidate=_can_consolidate
   1913         )
   1914         new_blocks = _extend_blocks(merged_blocks, new_blocks)

c:\users\jupyter-notebook\lib\site-packages\pandas\core\internals\blocks.py in _merge_blocks(blocks, dtype, _can_consolidate)
   3319 
   3320         argsort = np.argsort(new_mgr_locs)
-> 3321         new_values = new_values[argsort]
   3322         new_mgr_locs = new_mgr_locs[argsort]
   3323 

MemoryError: Unable to allocate array with shape (14, 1123883) and data type int64

該当のソースコード

以下のようなコードをたくさん書いていたら起きてしまいました。

def age(row):
    if row['a2'] == 0:
        return'19歳以下'
    elif row['a2'] == 1:
        return'20~24歳'
    elif row['a2'] == 2:
        return '25~29歳'
    elif row['a2'] == 3:
        return '30~34歳'
    elif row['a2'] == 4:
        return '35~39歳'
    elif row['a2'] == 5:
        return '40~44歳'
    elif row['a2'] == 6:
        return '45~49歳'
    else:
        return '50歳以上'
data['age'] = data.apply(age, axis=1)

試したこと

これを見つけましたが、
あまり理解できなかったし、
sklearnはここでは使っていなかったので、
別の解決方法があるのではと思いました!

何卒宜しくお願い致します。

version

Windows 10 pro
プロセッサ Intel(R) Core(TM) i5-8265U @1.60GHz 1.80GHz
実装RAM8.00 GB (7.79GB使用可能)

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • tiitoi

    2019/08/20 18:32 編集

    (14, 1123883) の形状で int64 というこうとは、DataFrame 1個で125MB必要ということになるので、そのメモリ搭載量の PC では DataFrame のコピーを沢山作ったりするとメモリ不足になるかもしれないですね。

    キャンセル

回答 1

0

メモリー不足でしょうか。
対策としては、
・使い終わった変数を都度明示的にGCする。
・巨大なテキストファイルを読み込んでいる場合は、一度に読み込まずに数回に分けて読み込む
などでしょうか。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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