私は現在、貴重なデータを毎日公開しているが、それらを長期間保存していないサイトから毎日データをスクレイピングして保存する Ruby on Rails プロジェクトに取り組んでいます。それらをスクレイピングしてデータベースに保存し、時系列データセットを作成しています。ほぼ75 のアセットがあり、各アセットには20 年間の履歴データがあります平均して。以前にアルゴリズムにエラーがあり、そのために現在の履歴データはすべて正しくありません。問題を見つけて、現在完全に機能しているアルゴリズムを書き直しました。過去 1 年間の履歴データ (1 つの資産) のデータベースを変更しようとしましたが、完全に機能しています。実際のところ、データベースをローカルで更新すると、1 年間の履歴データを持つ 1 つの資産に対して約 10 分かかります。heroku で同じことをすると、約 37 分かかり、非常に長いようです。それぞれ 20 年間の履歴データを含む 75 の資産があるため、75*20*37 = 55,550 分 = 925 時間かかるはずです。!!! 私には実現可能ではないようです。繰り返しになりますが、データは私たちにとって非常に貴重であるため、データベースを更新して、すべての履歴データを取得する必要があります。私はPostgreSQLデータベースをローカルとherokuでも使用しています。私の推測では、Rails のアクティブ レコードはこの種のことを行うように設計されておらず、非常に高価でもあります。この状況で私は何をすべきですか?私の問題の最適な解決策は何ですか? このタスクをより速く目的を完全に達成するにはどうすればよいですか? どんな種類の提案/アイデアも大歓迎です。
2 に答える
考慮すべき点がいくつかあります。上記のコメントで述べたように、 mu は短すぎるため、Rails が提供するオーバーヘッドを取り除くことが役立つ場合があります。Sequel gem を利用して、より少ないオーバーヘッドでデータベースにアクセスする rake タスクを作成することで、これを行うことができます。Sequelは、SQL の直感的でない構文や ActiveRecord のオーバーヘッドなしで効率的なクエリを作成するのに役立つ、かなり単純な API を提供します。
私は Heroku の内部構造について十分に理解していませんが、考慮すべきもう 1 つのことは、コードを実行している heroku のインスタンスが、rake タスクの重労働を十分に迅速に処理できるかどうかです。別のユーザーは、別のマシンから rake タスクを実行することで利益が得られるかどうか、または単に heroku インスタンスのリソースを増やすことで利益を得ることができるかどうかについてコメントする可能性があります。
私はすでにこの種の問題に遭遇しており、Sequelを使用して対処しました。Ruby で翻訳アルゴリズムを記述できますが、重い ActiveRecord 機能を使用する必要はありません。
Sequel で作成したアルゴリズムにまだ時間がかかる場合は、@mu が推奨されているように単純すぎるため、ストレートな SQL を作成する必要があります。Sequel コードを行 SQL に変換する方が、ActiveRecord コードよりもはるかに簡単でしょう。
最後に、実行する各スクリプトは 1 つの Heroku dyno で実行されますが、容量が限られているため、Heroku でスクリプトを直接実行するよりも、ローカルで実行して固定データベースを Heroku にアップロードする方が適切な場合があります。より多くのリソースを提供できるherokuアドオンもいくつかあるかもしれません。