はじめに
競馬の予測処理が失敗して、失敗以降のレースの予測ができていない問題が発生していました。予測に失敗していた際のログを確認したところ、下記の事象が発生していました。
- 「人気」の抽出に失敗して順位予測が行われない。
- 「馬体重」の抽出に失敗して順位予測が行われない。
- レース情報を取得した際に複数のレース情報を取得してしまい、順位予測に失敗することがある。
- レース毎にchromeを起動し、レース情報を取得しているが、chromeの起動に失敗してレース情報を取得できず、順位予測が行われない。
今回のバージョン1.2.1で、上記の事象を解消するための対処を行いました。また、冗長な処理を実施している箇所やメンテンス性向上のために出力するログの内容についても改修しました。
以下の内容については補足を記載しています。
変更点の概要
主な変更点は4点となります。
- 文字化けしたレース情報を取得して箇所を改修
BeautifulSoupでWebページを解析する際、一部の文字が文字化けし、順位予測に必要な情報の抽出に失敗していたので、Webページを解析する際の処理を改修しました。 - 順位予測の同時実行の方法を変更
マルチスレッドで動作していた箇所を、安定性の向上とCPUの有効活用のために、マルチプロセスで動作するように変更しました。 - 冗長な処理の改修
順位予測するたびに全レースのURLを取得していた処理を簡略化しました。 - 出力するログの内容を変更
ログ出力のメッセージを理解しやすい内容に変更しました。
変更内容の説明
主な変更点に記載した1.と2.について説明します。
文字化けしたレース情報を取得して箇所を改修
- requestsでレース情報のWebページを取得していました。
- 取得したWebページを読み取るときの属性が「content」の場合、文字化けが発生することがありました。
- requestsで使用する属性を「text」に変更することで文字化けを回避します。
- 「text」で読み取った内容から文字コードを読み取り、自動設定するように改修しました。
<改修前>
url = 'https://www.jra.go.jp/keiba/baba/'
res = requests.get(url)
soup = BeautifulSoup(res.content, 'lxml')
<改修後>
url = 'https://www.jra.go.jp/keiba/baba/'
res = requests.get(url)
res.encoding = res.apparent_encoding # resに含まれるテキストから文字コードを自動設定する
soup = BeautifulSoup(res.text, 'lxml')
補足:requestsの「text」と「content」の使い分け
requestsでWebページを取得するとき、属性を「text」と「content」のどちらを選択すべきかは、取得したWebページの使用内容と目的に依存します。
- 「text」を使用する場合
「text」はウェブページのテキストコンテンツを文字列として返します。一般的にHTMLドキュメントのテキスト部分(タグを除いたテキスト)を取得する際に使用します。ページ内のテキストを検索、抽出、または変更する場合に適しています。 - 「content」を使用する場合
「content」はウェブページの生のバイナリデータを返します。HTMLやXMLなどの構造化されたデータをそのまま取得します。テキスト以外のファイル(画像、PDF、音声など)を取得する場合や、ページの生のコンテンツをそのまま保存する場合に適しています。
通常、ウェブページの解析やデータ抽出のためには 「text」 を使用することが一般的のようです。ページ内のテキストを処理する場合、文字コードの自動検出(res.apparent_encoding)と組み合わせて使うと文字化けを回避できます。
順位予測の同時実行の方法を変更
- バージョン1.2.0までは順位予測の同時実行はマルチスレッドで実行していました。
- バージョン1.2.1からは順位予測の同時実行はマルチプロセスで実行するように変更しました。
- 文字化けレース情報以外で順位予測に失敗していることがありました。
- 1日に3つの場所でレースが開催される場合、まれに順位予測に失敗することがありました。
- 根本原因の特定まではできていませんが、順位予測の処理で想定外のデータを処理しようとしていました。
- 想定外のデータが含まれる可能性としては、マルチスレッドによるデータ共有の可能性があります。
<変更前>
with ThreadPoolExecutor(max_workers=3) as executor:
futures = []
for location in location_list:
logger.info('location:{}'.format(location))
futures.append(executor.submit(call_program.main, location, inifile, logger))
<変更後>
pool_size = 3
with Pool(pool_size) as pool:
pool.map(call_program.main, location_list)
補足:マルチプロセスとマルチスレッドのメリット、デメリットの整理
- マルチプロセスのメリット、デメリット
- メリット
-
-
- 独立性
各プロセスは独立して動作するため、プロセス間のデータ共有に対する懸念が少なく、データ競合の問題を避けるのが比較的容易である。 - 安定性
一つのプロセスがクラッシュしても、他のプロセスには影響を及ぼさない。アプリケーション全体の安定性が向上する。 - マルチコア対応
マルチプロセスは複数のCPUコアを活用しやすく、マルチコアプロセッサ上で並行性を高めることができる。
- 独立性
-
-
- デメリット
-
-
- リソース消費
プロセス間の切り替えにはコストがかかり、プロセスは通常、スレッドよりも多くのメモリとリソースを消費する。 - 起動コスト
新しいプロセスを生成するコストが高く、起動時間が遅い場合がある。 - 通信コスト
プロセス間でデータを共有するためには、通信コストがかかる。特にデータの複製とシリアル化が必要である。
- リソース消費
-
- マルチスレッドのメリット、デメリット
- メリット
-
-
- 軽量
スレッドはプロセス内で軽量に生成および管理できる。スレッド間の切り替えコストが低いため、高いスループットが得られる。 - 共有メモリ
スレッドは同じプロセス内で実行されるため、メモリ共有が簡単で効率的である。 - 簡単なコミュニケーション
スレッドはプロセス内で直接通信でき、グローバルなデータ構造を共有できる。
- 軽量
-
-
- デメリット
-
-
- デッドロック
複数のスレッドが同時にリソースにアクセスする可能性があるため、デッドロックやデータ競合の問題が発生する可能性がある。 - 不安定性
一つのスレッドのクラッシュは、プロセス全体に影響を及ぼす可能性がある。プロセス全体の安定性が低下することがある。 - GIL(Global Interpreter Lock)
Pythonなどの一部の言語では、GILによりスレッドごとのPythonコード実行が制限され、マルチコアプロセッサを効果的に活用できない場合がある。
- デッドロック
-
変更したファイルの一覧
変更したファイルと変更概要をまとめした。
順位予測時にレース情報を取得する際、冗長な処理だったので見直しを行った結果、「get_raceInfo.py」は廃止して「call_program.py」にレース情報を取得する処理を統合しました。
ファイル名 | 変更概要 |
main.py | 順位予測の同時実行の方法を変更 |
call_program.py | 冗長な処理の改修 |
fnc.py | 文字化けしたレース情報を取得して箇所を改修 |
get_cellTime.py | 文字化けしたレース情報を取得して箇所を改修 |
get_raceInfo.py | 廃止(冗長な処理だったので廃止) |
get_Results.py | 文字化けしたレース情報を取得して箇所を改修 |
get_raceResults_after_finalRace.py | 文字化けしたレース情報を取得して箇所を改修 |
バージョン1.2.1の実行方法
- 実行する手順はバージョン1.0.0と同じです。
バージョン1.2.1のダウンロード
バージョン1.2.1はnoteで有料公開しています。
費用は300円となります。
競馬予測システムバージョン1.2.1のダウンロード
コメント
はじめまして。pandasの勉強中、検索でこちらのブログを見つけて記事を拝見しました。
とても有益な情報の公開に感謝します。
不躾なお願いではありますがAIを学ぶ上で参考にされた本やサイトがありましたら教えていただけないでしょうか。
勉強の参考になれて幸いです。
AIを学ぶ上で一番最初に参考にした本は下記となります。
Pythonで儲かるAIをつくる
掲載されたプログラムを模写することで、AIのプログラムを作成するために必要な事柄を学ぶことができました。AIの学習において、統計や数理の学びも必要になりますが、最初は実際に作成して概要を捉えることが良いと思います。
AIの学習初期に参考にしたサイトはありませんでした。
理由としては「AIの初学者向けに、体系的にまとまったサイトがなかったから」となります。本とサイトで情報量を比較すると、やはり本のほうが多く、体系的にまとまっています。個人的な意見となりますが、AIの学習初期では本を通して体系的に概要を把握したほうがよいと思います。
ご返答ありがとうございます。
分からないことが多く、サイトからの情報のみでは理解が進まなかったので早速教えていただいた本を参考に実践してみます。