Pythonニュース取得が遅いので、重複時はHTML取得しないようにした
RSSから30件のニュースを得て本文を抽出するまで10分近くかかった。20秒/1件。遅すぎる。
成果物
対策
ない。たぶんURL先から新たなHTMLを取得するところに最も時間がかかっているのだろう。なら、できるだけHTML取得する頻度を下げるしかない。妥協。
重複ニュースを事前に検知する
HTMLを取得する前に、RSSのpublished
とurl
が同一レコードがDBに存在するか確認する。もしあれば、HTML取得せず、DB挿入対象にもしない。
if news_db.is_exists(published,url): continue
がポイント。
get_news.py
for entry in entries: ... if news_db.is_exists(published,url): continue body = extractor.extract(get_html.get_html(url)) news_db.append_news(published, url, title, body); news_db.insert();
mod/NewsDb.py
class NewsDb: ... def is_exists(self, published, url): count = (self.conn.cursor().execute( 'select count(*) from news where published=? and url=?;' ,(published, url)).fetchone()[0]) return False if 0 == count else True ...
結果
重複が0件のときは4秒くらいで終わるようになった。劇的。というか、これは論理的にみて当然。
問題
重複しないところは以前として遅い。むしろ、それこそが問題の本質。
サーバ負荷を考慮してURLごとに1秒待機させているが、それにしても20秒/1件は遅すぎる。待機時間いらないだろ。
対象環境
- Raspbierry pi 3 Model B+
- Raspbian stretch 9.0 2018-11-13 ※
- bash 4.4.12(1)-release ※
- Python 3.5.3
- SQLite 3.29.0 ※
- MeCab 0.996ユーザ辞書
$ uname -a Linux raspberrypi 4.19.42-v7+ #1218 SMP Tue May 14 00:48:17 BST 2019 armv7l GNU/Linux