やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

ニュース取得(インメモリ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全体でなくフィードごとにおける最新日時を取得する必要がある。ほかにも解法がありそう。ワークフローを考える必要がある。

所感

 取りこぼし問題に目をぶつれば、このくらいが楽で良かった。だが、もうすこし完成度をあげたい。狙いは以下。

  • 重複せず全ニュースを取得できること
  • 重複せずファイル保存できること
  • 重複チェック処理の実装をSQLite3に丸投げしたい(自前でPython実装したくない)
  • 重複チェック処理を最小限にしたい

 本当ならカテゴリ分類までしたいところだが、そもそもカテゴリ分類が曖昧なため難しそう。同一ソースなら分けられるだろうが、別ソース間での整合性はとれないだろう。サイトごとに異なる分類がされるのだから。

対象環境

$ uname -a
Linux raspberrypi 4.19.42-v7+ #1218 SMP Tue May 14 00:48:17 BST 2019 armv7l GNU/Linux