ニュース取得(インメモリDBとRAMディスクを使う)
まだ取りこぼしが起こりうる。
成果物
方法
統合
同一ソース別カテゴリのフィードを、1つのDBにまとめる。
feed_source_A_list.txt
http://A/A_category1.xml http://A/A_category2.xml
cat feed_source_A_list.txt | ./run.sh ./A.db echo "http://B/B.rdf" | ./run.sh ./B.db
インメモリDB・RAMディスクDB
`:memory:` | RAMディスク | 永続ディスク | |
---|---|---|---|
保存期間 | プロセス中 | PC電源ON中 | 永続 |
保存場所 | メモリ | メモリ | ファイル |
保存場所 | 内容 | 用途 |
---|---|---|
:memory: |
最新フィード | 取得時点における同一ソース別カテゴリのニュース重複チェック |
RAMディスク | PC電源ON〜OFFまでのフィード | HTML取得前にフィードだけを表示するため |
永続ディスク | 全ニュース | 本文抽出まで完了した完全なデータ |
たとえば1日4時間ごとにフィードを取得するとき。:memory:
は取得処理する間だけ、最新フィードを持つ。それをRAMディスクへ重複なく挿入する。最後に、取得処理するたびに永続ディスクの最新日時を取得する。それより新しいニュースだけを:memory:
から取得して挿入する。
問題
ニュースの取りこぼしが生じうる。永続ディスクにある最新日時より新しいニュースのみを取り込むのが問題。もしこれが1つのフィードだけなら問題ない。だが、複数のフィードを含めているなら、ニュースの取りこぼしが生じうる。
たとえばフィードAの最新日時よりフィードBの最新日時が古かったとする。次に4時間後、ふたたび両フィードからニュースを取得する。このとき、フィードBには、前回のフィードAの最新日時より古い未登録のニュースがあったら、取り込まれない。
これを解決するには、DB全体でなくフィードごとにおける最新日時を取得する必要がある。ほかにも解法がありそう。ワークフローを考える必要がある。
所感
取りこぼし問題に目をぶつれば、このくらいが楽で良かった。だが、もうすこし完成度をあげたい。狙いは以下。
本当ならカテゴリ分類までしたいところだが、そもそもカテゴリ分類が曖昧なため難しそう。同一ソースなら分けられるだろうが、別ソース間での整合性はとれないだろう。サイトごとに異なる分類がされるのだから。
対象環境
- 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