herokuにてDjango製のウェブアプリケーションをデプロイしているのですが、Freeプランであるために、メモリ不足に苛まれています。
スクレイピング処理に関して関数を書き、ウェブアプリケーション側でその関数を使用しています。関数はリストを返します。
ここで質問なのですが、返り値のリストがおそらくメモリ不足の原因なので、バッチ処理か、またはキャッシュするか何かしたいのですが、リストを返す関数を全く変えずに行うことって可能でしょうか?
というのも、スクレイピングを行う都合上、関数内部でバッチ処理等を行うとなると、かなり大幅な変更を加えなければならず(連続でデータを取らなければならないので「途中で切る」というのが難しいです。)、関数内部を変更するぐらいならば(デプロイしているといっても、Freeプランを使っている通り趣味程度のものなので)下手な変更は加えずそのままにしたいというのがあります。
リストをpickleで保存するとかぐらいしか思いつかない(リスト作成後の処理はデータベースへの保存ぐらいなので、これもほとんど意味ないかなと思っております。。。書いててやはり無謀な気がしてきました(^ ^; )のですが、もし何かご存知の方がいらっしゃいましたら、ヒント程度でもいいので教えていただけると幸いです。
雑な質問ですみません...よろしくお願いします。m(_ _)m
追記
ご指摘ありがとうございます。リストの構造はこんな感じです
python
1[ 2 { 3 data1: "文字列データ1(半角40字程)", 4 data2: "文字列データ2(半角160字程)", 5 data3: "日付データ(例: 2018-10-02T23:02:37.000Z)", 6 data4: { 7 data3_1: "10字程度の文字列", 8 data3_2: "長さ不定の文字列" 9 }, 10 }, 11 { 12 # 上記と同様 13 }, 14 # ...これぐらいのものが100個で一つのリストです。 15]
これで大体1000MBぐらいでした。(1GBもあるわけない(^ ^; 表記を誤りました)
これで大体1000Bぐらいでした。
関数がリストを保持しなければならない理由は、繰り返しとなってしまいますが、「スクレイピングで連続でデータを取っているために途中でデータベースに保存といった処理を介入させるのが難しい」ことと、それに付随して「関数にデータベース保存の処理を入れるとなるとすべて書き直しとなり、それぐらいならば現状維持でよい」というのがあります。要は面倒だからです。Django以外で使用する可能性はないとはいえ、関数中にDjangoによるハードコードを介入させたくないというのもあります。
...ただ書いてて思いついたのは、イテレータにするという手はあるかなとは思いました。データベースに保存する処理を待たなければなりませんが、個々のデータに関係性はないため、書き直しはできるかもしれません。ちょっと試してみようと思っています。
あなたの回答
tips
プレビュー