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

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

新規登録して質問してみよう
ただいま回答率
85.35%
機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

17429閲覧

Pythonで初めてmemory errorが起きた。

退会済みユーザー

退会済みユーザー

総合スコア0

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/05/03 11:20

前提・実現したいこと

機械学習初心者です。
以下のサイトでアニメのレコメンド機能の実装を扱っていたのでおもしろいと思い、サンプルコードをjupyter notebookで打っていました。
https://www.codexa.net/collaborative-filtering-k-nearest-neighbor/
630万件のデータを扱っているからか、初めてmemory errorが出て困っています。

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

MemoryError: Unable to allocate 695. MiB for an array with shape (2851, 31957) and data type float64

該当のソースコード

Python

anime_pivot = mergedf.pivot(index='name', columns='user_id', values='rating_user').fillna(0)

試したこと

sample()で700万件近くあるratingのインデックスを10万件に減らしてみましたが、結果は同じでした。

補足情報(FW/ツールのバージョンなど)

流れとしては
mergedf = rating.merge(anime, left_on = 'anime_id', right_on = 'anime_id', suffixes=['_user', ''])
mergedf.info()
[Int64Index: 76178 entries
memory usage: 4.6+ MB]
mergedf = mergedf[['user_id','name','rating_user']]
mergedf = mergedf.drop_duplicates(['user_id', 'name'])
animepivot = mergedf.pivot(index='name', columns='user_id', values='rating_user').fillna(0)
でエラーが起きてしまいました。
使っているパソコンのメモリは16GBですし、Anime Recommendations Database memory errorと調べても全然ヒットしなかったので自分だけなのか、jupyterの設定かなにかよく分かりません。
どんなアドバイスでも構いません。よろしくお願いします。

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

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

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

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

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

jbpb0

2021/05/03 11:51

Pythonコードを実行する前からエラーが出るまで、OSの機能でメモリーの残り量をモニターし続けたら、何か分かるかもしれません
退会済みユーザー

退会済みユーザー

2021/05/03 11:55

なるほど。その時はタスクマネージャーを使うってことでしょうか?
jbpb0

2021/05/03 12:00 編集

> タスクマネージャーを使う Pythonを実行しているOSがWindowsならば、そうです メモリー使用量が多い順に並ぶように表示して、エラーが出た時にメモリー残り量が本当に枯渇したのか、もしそうならば何がその時にメモリーを消費していたのか、を確認します
meg_

2021/05/03 12:00

8GBのPCで該当箇所まで試してみましたがエラーは発生しませんでした。実行したコードを全て掲載してみてください。※参考URLのコードをコピペで実行してもエラーが発生しますか?
退会済みユーザー

退会済みユーザー

2021/05/03 12:13

今一つずつコピペしたんですが、 mergeddf = mergeddf[['user_id','name','rating_user']]を打った時点でmemory errorが出ました。 ちなみにエラーは MemoryError: Unable to allocate 182. MiB for an array with shape (4, 5957004) and data type int64でした。 mergedfがおかしいのかなと思い、一つ手前の mergeddf = ratings.merge(anime, left_on = 'anime_id', right_on = 'anime_id', suffixes= ['_user', ''])を更新すると新たにエラーが出ました。 MemoryError: Unable to allocate 45.4 MiB for an array with shape (5957004,) and data type int64 どういうことなのか分かりませんでしょうか?
退会済みユーザー

退会済みユーザー

2021/05/03 12:16

タスクマネージャーのメモリを見ていると瞬間的に増える様子はないですね。 何度か質問の箇所を更新したりしていたら、python(32ビット)のメモリが少しずつ増えてきて、500MBくらいだったのが今は1079MBになっています。
退会済みユーザー

退会済みユーザー

2021/05/03 12:21

Jupyterの使い方に関しては大丈夫でした。
jbpb0

2021/05/03 13:32 編集

パソコンを再起動してからPythonコードを実行したら、どうなりますか?
meg_

2021/05/03 13:04

jbpb0さんがおっしゃるようにメモリーが解放されていないかもしれませんね。jupyterでしたらカーネルの再起動をすればメモリが解放されるでしょう。
jbpb0

2021/05/03 23:22 編集

タスクマネージャーの「パフォーマンス」の「メモリ」を選ぶと、利用可能な残り容量が分かりますよね それが、Pythonコード実行前にどれくらい残っているのか? エラー出た時にどれくらい残っていたのか? エラー出た後に増えるのか? (実行前と同じくらいに戻るのか?) なお、タスクマネージャーの「表示」の「更新の頻度」は「高」にしておく方が、急激な変化の見落としが少なくなります
jbpb0

2021/05/03 23:46

メモリー残り量が充分にあるのにエラーが出るのなら、hayataka2049さんが回答に書いてるように32bitアプリの制限に引っかかってるのかも pythonのメモリー使用量を調べるとか 参考 https://qiita.com/fockl/items/ada469c138900caaf0a8
guest

回答1

0

ベストアンサー

64bitwindowsにおいて32bitプロセスのメモリ使用量は上限2GBです。

https://jpdsi.github.io/blog/internet-explorer-microsoft-edge/HighMemoryUsage/#:~:text=Windows%20OS%20%E3%81%AE%E4%BB%95%E7%B5%84%E3%81%BF%E4%B8%8A,%E7%90%86%E8%AB%96%E5%80%A4%E3%81%A8%E3%81%97%E3%81%A6%202GB%20%E3%81%A7%E3%81%99%E3%80%82

32bit版で頑張るのであれば、無駄なデータがGCに回収されずに残るようなことをできるだけ減らし、あとは可能な限りインプレース処理を使うとかするしかありません。

投稿2021/05/03 13:57

hayataka2049

総合スコア30935

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

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

hayataka2049

2021/05/03 14:04

上限は条件次第で4GBになりそうな気もしますが、とにかく割としょぼい容量で限界が来ます。 https://qiita.com/s_Pure/items/d559c7c9422ac3e10fa5 こだわりがなければ、64bit版を入れ直せばパソコンに積んだメモリまでは使えます。
退会済みユーザー

退会済みユーザー

2021/05/03 23:48

64bitに変えたらエラーが起きなくなりました! メモリを見ていると問題の箇所では3500MBくらいまで上昇したのでやっぱりここ頭打ちになってたようです。環境も一新してこれから頑張っていきたいと思います。 本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問