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

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

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

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

0回答

1954閲覧

Python3、バッチ処理する方法についてヒントをいただきたいです。

namnium1125

総合スコア2043

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

1クリップ

投稿2018/10/02 17:06

編集2022/01/12 10:55

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によるハードコードを介入させたくないというのもあります。

...ただ書いてて思いついたのは、イテレータにするという手はあるかなとは思いました。データベースに保存する処理を待たなければなりませんが、個々のデータに関係性はないため、書き直しはできるかもしれません。ちょっと試してみようと思っています。

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

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

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

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

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

t_obara

2018/10/02 17:37

全く変えずというと、リストを作成することに変わりがないため、メモリをその分使用するということなので、何らか変更せざるを得ないと思いますが、、ウェブアプリでその関数を直接呼ぶのではなく、バッチで行った関数の処理結果をウェブアプリで使用したいということでしょうか。
namnium1125

2018/10/02 17:45

コメントありがとうございます。アプリから直接呼んでいる現状で、なにか良いワンクッションを置けばメモリ不足が改善されるかなと思い質問した次第です。。そのためあまり明確な考えはないです(バッチ処理とは書きましたがそのあたりも深く考えてはいないです。。。タイトル変更したほうがいいのでしょうか?(^ ^; )
quickquip

2018/10/02 22:31 編集

一番最初にやるべきことは「どのぐらいの大きさのリスト」になっていて「そこに格納されている情報がどのぐらいの大きさか」を**実際に調べること**です。"おそらく"などと言っている段階で手を加えるとろくなことにならないし、**どのぐらい**節約しなければならないかも判断できません。どのぐらいの長さのリストに、どんな型のどんな大きさのデータが入っているのかすら書いてないですよね。あと、どんな関数がなぜリストを保持しなければならないのか? なぜそのリストを返さなければならないのかが、他人にはまったく伝わってません。今の質問では、返さないでデータベースへ保存して破棄すればいいじゃないか、としか思えないです。
quickquip

2018/10/03 03:34

"長さ不定の文字列" の部分が1件あたり平均して10MBぐらいあるということですね。
namnium1125

2018/10/03 03:59

ご指摘ありがとうございます。表記ミスでした...ごめんなさいm(_ _)m
quickquip

2018/10/03 04:16 編集

だとするとこれが全部で30万件から50万件ぐらいあるということですね。(「100個で一つのリスト」が3千から5千個ぐらいある?)
namnium1125

2018/10/03 05:47

リストは返り値として返したのち即座にDBに保存される(つまり1KB以上メモリを食うことはないはず)ので、最初のご指摘の通り、私が調査不足なだけだったようです。。。ありがとうございます。(それとなんというかごめんなさい) もしかしたらseleniumから起動しているchromeが原因かもしれません、調べてみます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問