回答編集履歴

1

d

2019/04/19 09:02

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -57,3 +57,35 @@
57
57
 
58
58
 
59
59
  使用する分だけ DB からメモリに展開する、使い終わったら開放するといったコードを記載するのがよいでしょう。Python の場合、ガレージコレクションがあるため、参照されなくなったオブジェクトは自動で破棄されます。
60
+
61
+
62
+
63
+ ## 追記
64
+
65
+
66
+
67
+ > ・メモリ、スワップ上を超えたデータが取得された場合、OS側でエラーとなり、
68
+
69
+
70
+
71
+ メモリ不足が発生した場合、エラーといっても try-except 文で補足できるような形の例外が発生することは期待できず、アプリケーションがクラッシュする、最悪 OS を巻き込んで落ちるといった可能性もあります。
72
+
73
+ なので、そもそもメモリ不足が発生するような状況はアプリケーションの仕様上起こらないようにする必要があります。
74
+
75
+
76
+
77
+ > 大量データで処理をするときに、yeildを用いて一行ずつデータを展開させるようにすれば、少しはよくなるかも?
78
+
79
+
80
+
81
+ 回答の内容で「使用する分だけ DB からメモリに展開する」というのは、例えば、10万件のレコードがあるテーブルの中身を表示するとして、それを一度に全部取得して、表示しようとしたら、メモリ不足になるかもしれません。
82
+
83
+ そうするのではなく、一度に100件ずつ表示するように制限すれば、必要なメモリは100件分だけなので、少ないメモリ量で済みます。
84
+
85
+ 「1 ~ 100」行表示して、「次へ」をクリックしたら、次の「101 ~ 200」行を表示するといった具合です。
86
+
87
+ この場合、「101 ~ 200」行を表示する際は、「1 ~ 100」行のデータは不要なので、メモリに置いておく必要はなくなり、メモリ上には常に100行分のデータだけ展開されていることになります。
88
+
89
+
90
+
91
+ ここ (teratail) もそうですが、沢山のデータがある場合は一度に表示されるのは10件ずつとか件数が決まっており、「次へ」をクリックしてページ送りするような作りになっています。