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

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

新規登録して質問してみよう
ただいま回答率
85.46%
Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python

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

Q&A

2回答

1545閲覧

pythonで1260^3の3次元配列を可視化したい

flflfluid

総合スコア0

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python

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

1グッド

0クリップ

投稿2021/11/10 01:37

前提・実現したいこと

matplotlibのscatterで126012601260の3次元配列を可視化したい。
3次元配列を等間隔にプロットし、値をヒートマップで表示したい。

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

15GB(126012601260,double型)の配列をax.scatterで3次元プロットしようとしたところ、以下のエラーメッセージが出ました。

numpy.core._exceptions.MemoryError: Unable to allocate 29.8 GiB for an array with shape (2000376000, 2) and data type float64

該当のソースコード

Python

1f = open(filename,mode='rb') 2AR = np.fromfile(f,np.double,count=int(nx*ny*nz)).reshape(int(nx),int(ny),int(nz)) 3X,Y,Z = np.meshgrid(range(nx),range(ny),range(nz)) 4 5fig = plt.figure(figsize=(12,12)) 6ax = fig.add_subplot(111,projection='3d') 7im = ax.scatter(X,Y,Z,c=AR,cmap=custom_jet,vmin=imin,vmax=imax)

試したこと

データ点数を各辺4分の1(315315315)にすると、エラーは無くなりました。
ハード的には充分なメモリがあるため、ライブラリに原因があると考えています。

3次元配列をfloat16に変換してから、scatterに突っ込んでも同様のエラーが出ました。

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

原因と解決法が分かる方がいましたら、よろしくお願いします。
matplotlibでないといけない理由はないため、他の方法が分かる方でもお願いします。

退会済みユーザー👍を押しています

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

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

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

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

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

jbpb0

2021/11/10 02:43 編集

OSは何でしょうか? たくさんメモリーを使うのを実行した場合、Macはストレージ(ハードディスクやSSD)が空いてれば、それ使って何とか頑張って実行してくれますが、Windowsはストレージに余裕があっても、メモリーエラーを出すことがあります
flflfluid

2021/11/10 02:45

ご質問ありがとうございます。 OSはlinuxです。
dameo

2021/11/11 12:49

uname -aと ulimit -aの結果を貼って頂けないでしょうか?
flflfluid

2021/11/11 13:03

ご質問ありがとうございます。 uname -a Linux ###### 4.12.14-95.80-default #1 SMP Thu Jul 15 18:19:59 UTC 2021 (db4c18a) x86_64 x86_64 x86_64 GNU/Linux ulimit -a core file size (blocks, -c) unlimited data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 file size (blocks, -f) unlimited pending signals (-i) 256093 max locked memory (kbytes, -l) unlimited max memory size (kbytes, -m) unlimited open files (-n) 1024 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) 819200 real-time priority (-r) 0 stack size (kbytes, -s) 8192 cpu time (seconds, -t) unlimited max user processes (-u) 100 virtual memory (kbytes, -v) unlimited file locks (-x) unlimited
flflfluid

2021/11/12 01:16

情報ありがとうございます。 解決しましたら報告します。
guest

回答2

0

同じエラーが発生し解決策が見つからない状況です。
もし、解決済みでしたら対策をご教授いただければ幸いです。

投稿2023/06/14 13:46

potemkin

総合スコア2

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

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

0

自作のデータが15GBでも、それをscatterするときには、作業用メモリを使うはずです。

29.8 GiB for an array with shape (2000376000, 2) and data type float64
と書かれていますから、メモリ不足になるのでしょう。

メモリを増設するしかないように思います。

投稿2021/11/10 01:59

ppaul

総合スコア24666

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

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

flflfluid

2021/11/10 02:36 編集

説明不足ですいません。 作業用メモリを使っていたとしても、十分なメモリがあるはずです。 具体的には200GB以上あります。 ストレージではなく、メモリです。
退会済みユーザー

退会済みユーザー

2021/11/20 08:35 編集

駄目押しでSSDにスワップを256GBくらい作ってはいかがでしょうか? …arrayで30GBのデータを表示するのに200GB以上のメモリでも足りないんですね。 あとは「どうせグラフなんだし値が多少変わろうが見た目は変わらんでしょう。」と決め込んで float64-->float16とすればメモリ使用量はarrayだけでも1/4まで減らせます。(描画する時のメモリ使用量も1/4になるか、指数関数的に1/16や1/64になるかはわかりません)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問