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

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

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

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

PyCharm

エディター・開発ツール

Q&A

2回答

329閲覧

Python を使って、sst[t,lon,lat]という時間t,経度lon,緯度latの3次元の海面水温データsstを扱おうとしています。メモリー足りません。

KAIsan

総合スコア0

Python

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

PyCharm

エディター・開発ツール

0グッド

0クリップ

投稿2024/09/02 11:53

実現したいこと

ここに実現したいことを箇条書きで書いてください。

  • ▲▲機能を動作するようにする

前提

ここに質問の内容を詳しく書いてください。
(例)
「Python でsst[t,lon,lat]で表される海面水温(sst)3次元配列データを扱っています。sstは時間t, 経度Lon,緯度latを指定すれば出力されます。このsst データを30年間分読み込み、それぞれの年から同じインデックス(すなわち同じ時間、経度、緯度)のsstを取り出し、その中で上位10%の境となるsstを取り出そうとしています。」しかし、t=365個または366個、経度lon=1440個、緯度lat=720個も合って、30年間分のsstデータから先ほど説明した事、すなわち「」で囲われた操作がメモリーが足らず、強制終了してしまいます。
こんなに大きいデータをうまく扱う方法、特にデータの読み込みからsstを取り出し、30年間分をnumpy を使ってリストにしようとする所で強制終了します。誰かいい方法はありませんか?
■■な機能を実装中に以下のエラーメッセージが発生しました。

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

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

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

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

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

otn

2024/09/02 13:15

まずは、必要なメモリー量を見積もりましょう。 PCにメモリー増設すれば(将来のデータ増があっても)解決する話なのか、全く無理なのかによって、方針が変わってくるかと思います。
bsdfan

2024/09/02 13:48

今ある30年分のデータがどのように存在しているかの情報もあった方がいいと思います。 1つのファイルなのか、複数に分割されているのか、どんな形式か、ファイルのサイズはどれぐらいか、とか。
meg_

2024/09/02 15:21 編集

> すなわち「」で囲われた操作がメモリーが足らず、強制終了してしまいます。 そのマシンのメモリはいくつですか? > こんなに大きいデータをうまく扱う方法 データのサイズはいくつですか? > 特にデータの読み込みからsstを取り出し どういう方法で読み込みや取り出しを行っていますか?
melian

2024/09/02 20:44 編集

例えば以下のサイトから1年分の SST データをダウンロードして、 Sea Surface Temperature Data https://surftemp.net/regridding/index.html 1日分のデータをロードしてみます。 >>> hf = h5py.File('SST_ABSO_050_20230101_20231231_regridded/20230101_regridded_sst.nc', 'r') >>> hf['sst'] <HDF5 dataset "sst": shape (1, 720, 1440), type "<f4"> >>> hf['sst'][()] array([[[-32768., -32768., -32768., ..., -32768., -32768., -32768.], ..., [271.35, 271.35, 271.35, ..., 271.35, 271.35, 271.35]]], dtype=float32) >>> import sys >>> sys.getsizeof(hf['sst'][()]) 4147344 30年分のデータのメモリ使用量は、線形外挿による評価値では42GB程度といったところでしょうか。 >>> 4147344 * 365 * 30 / 1024 ** 3 42.294540256261826
bsdfan

2024/09/04 11:35

質問者さんからの反応がないようですが、https://qiita.com/wm-ytakano/items/586960f08c8b9fc30542 によると「Xarrayは大気海洋分野のデータ解析に用いるPythonパッケージのデファクトスタンダート」とのことなので、Xarray を使うのもいいんじゃないでしょうか。Xarray は裏で HDF5(netCDF) や Zarr を使えるので、メモリにのりきらないデータも扱えると思います。 (ただ、今回のケースでは全データをメモリに載せる必要もないので、すでにある回答の内容でよいと思われます)
guest

回答2

0

「 」を見ると 全ての場所の 30年分の 全ての日 の 全ての時刻 のデータを取り込んでから計算する と読めます。そうではなく、「一つの計算結果を求めるのに必要なデータだけ取り込んで計算が終ったら捨てる」ようにすれば良いのです。
一つの計算結果は 「ある場所のある日のある時刻の上から10%の温度」ですね?すると 30年分でたった30個です。むしろ計算結果を全部残しておくほうが多いでしょう。「場所の数 x 365 x 一日の測定回数」 ですから。これもメモリが足らなくなるほどの量ならひとまとまり毎にファイルに書き出します。

視点が変わりますが
上から10% で良いのですか?温度分布の偏りが激しいと希望する値ではなくなるかも。
「その時刻の一番高い値が欲しいのだが異常値を拾いたくないから10%の値を採る」と思われます。ずっと10度だったのだがここ5年でぐんぐん上がって20度になった 様なときに、ほしいのは 20度近くになっている値だと思うのですが25年分の10度が引っ張ってぐんぐんの「ぐ」の辺りになってしまう。(いくら異常気象でも10度も変わらんか)
その年のその日のその時刻 に機器がおかしかったのか、確かに高いのか は その前後の時刻での値の動き、とか その前後の日の同じ時刻の値の動きとか から判定した方が良いのでは
違うか?
「ある年だけ異常に暑かった のを外す」ためかな。だと判定方法は違いそう。
標準偏差σ に対し 3σ以上離れてる、2σ以上離れてる のは無視 とかかな。(0.13% 、2.3% )
上から10%だと 1.28σで切ってます。(正規分布なら。ぐんぐん みたいに正規から大きくずれると。。。)
データがたかだか30だから統計使うのも無理かな。

投稿2024/09/02 23:31

編集2024/09/02 23:32
winterboum

総合スコア23549

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

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

0

t=365個または366個、経度lon=1440個、緯度lat=720個も合って、30年間分

それほど大きなデータではなさそうですが。

以下の何れかを試してみてはどうでしょう。

  • データが入るだけのメモリを用意する。
  • データを逐次読み出して目的の分類(=30年分)のファイルに保存してファイル毎に処理する。
    それでもメモリが足りない(そんなことにはならないように思うが)ようであれば、アルゴリズムを考える。

「データベースに入れる」と思ったけれど、そのDBが入るメモリがあれば、そもそも処理できるはず。

とりあえずこういう問題は、メモリを増やすか、代りにファイルを使うか、で解決を図ります。

投稿2024/09/02 14:14

TakaiY

総合スコア13687

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問