現在、大量データ(DBから全件取得)を取り込もうとしたときに、
メモリ領域が足りずにデータが途中までしか取り込めないなんて
ケースを想定した際の対応をどうすればいいか考えております。
OS:rhel7.6
言語:Python3.7
<教えてほしいこと>
・Pythonが保持できるメモリ領域の最大は?
また、その領域は変更可能か?
・メモリ領域で抱えられないデータを取り込もうとしたとき、
そのデータはどのように処理されるのか?
テストして試したいんですけど、
その方法もわからずに、瞑想してます。。。。
どれか一つでもいいので教えていただけることがあったら
教えてください!!!<(_ _)>
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答3件
0
ベストアンサー
Pythonが保持できるメモリ領域の最大は?
スワップ領域もありますが、基本的には、PC に搭載しているメモリ量と考えてよいのではないでしょうか。
Linux であれば、free
コマンド、Widnwos であればタスクマネージャーでメモリ使用量を確認できます。
また、Python のコードで確認したい場合は、メモリなどシステムに関する情報を確認できる psutil というライブラリがあります。
psutil documentation — psutil 5.6.2 documentation
python
1import psutil 2 3info = psutil.virtual_memory() 4print(info) 5# svmem(total=67497332736, available=54389481472, percent=19.4, used=10516938752, 6# free=17032527872, active=18114748416, inactive=24519929856, buffers=431259648, 7# cached=39516606464, shared=2041597952, slab=6908645376) 8 9print('available: {:.2f} GB'.format(info.available / 2**30)) # free: 50.65 GB
メモリ領域で抱えられないデータを取り込もうとしたとき、そのデータはどのように処理されるのか?
アプリケーションがクラッシュするなど何が起こるかはわかりません。動作未定義と思います。
使用できるメモリ量以上のメモリを使うようなプログラムを書くことは NG です。
そもそもメモリとは処理に使用するデータを一時的に置いておく場所なので、「DB の中身を全部メモリに展開しようとする」という使い方自体がおかしいと思います。
使用する分だけ DB からメモリに展開する、使い終わったら開放するといったコードを記載するのがよいでしょう。Python の場合、ガレージコレクションがあるため、参照されなくなったオブジェクトは自動で破棄されます。
追記
・メモリ、スワップ上を超えたデータが取得された場合、OS側でエラーとなり、
メモリ不足が発生した場合、エラーといっても try-except 文で補足できるような形の例外が発生することは期待できず、アプリケーションがクラッシュする、最悪 OS を巻き込んで落ちるといった可能性もあります。
なので、そもそもメモリ不足が発生するような状況はアプリケーションの仕様上起こらないようにする必要があります。
大量データで処理をするときに、yeildを用いて一行ずつデータを展開させるようにすれば、少しはよくなるかも?
回答の内容で「使用する分だけ DB からメモリに展開する」というのは、例えば、10万件のレコードがあるテーブルの中身を表示するとして、それを一度に全部取得して、表示しようとしたら、メモリ不足になるかもしれません。
そうするのではなく、一度に100件ずつ表示するように制限すれば、必要なメモリは100件分だけなので、少ないメモリ量で済みます。
「1 ~ 100」行表示して、「次へ」をクリックしたら、次の「101 ~ 200」行を表示するといった具合です。
この場合、「101 ~ 200」行を表示する際は、「1 ~ 100」行のデータは不要なので、メモリに置いておく必要はなくなり、メモリ上には常に100行分のデータだけ展開されていることになります。
ここ (teratail) もそうですが、沢山のデータがある場合は一度に表示されるのは10件ずつとか件数が決まっており、「次へ」をクリックしてページ送りするような作りになっています。
投稿2019/04/19 05:46
編集2019/04/19 09:02総合スコア21960
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

0
「スワップ領域」
https://begi.net/read/base/09.html
投稿2019/04/19 05:35
総合スコア6762
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。