質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Twitter

Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

Q&A

0回答

1476閲覧

【Rails】Twitter APIにて、任意のユーザのツイートの取得を高速化したい

tasukuPlus

総合スコア6

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Twitter

Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

0グッド

0クリップ

投稿2018/07/17 06:45

前提・実現したいこと

Ruby on Railsにて、 Twitter api を用い、任意のユーザーの一週間分のツイートを取得する処理を書いています。
実現したい処理自体は実装出来たのですが、レスポンススピードが遅く、待ち時間が多く発生します。そこで、ツイートを一軒づつ取得する処理を並列化できないかと考えました。

そこでご質問なのですが、下記コードの処理を並列化する事は可能でしょうか?
または、この処理を高速化する手段はございますでしょうか?

該当のソースコード

Ruby

1#任意のユーザのツイートを一週間分取得する処理 2#not_within_a_week?(tweet) 今日〜一週間以内のツイートであるか否か判定する関数 3#create_client 認証情報を渡す関数 4#tweet_update データベースにデータがあれば、情報の更新 5#tweet_add_db なければ新規登録 6 7client = create_client 8user_id = '任意のユーザーID' 9is_break = false 10max_id = client.user_timeline( user_id )[0].id #最新のツイートのid.このidから遡っていく. 11 1216.times{#3200件以上のツイートを遡れない為、16回ループ(200*16=3200) 13 #*********↓この処理を並列化したい↓*********# 14 #最新のツイートのidから200件遡り取得.最後に処理したツイートのidから、再度200件取得.この処理を、ツイートが一週間以内のものに限り、16回繰り返す. 15 client.user_timeline(user_id, count:200, max_id:max_id, include_rts: false, exclude_replies: false).each {|tweet| 16 is_break = true and break if not_within_a_week?(tweet) #一週間以内のものでなければbreak 17 if Tweet.find_by(tweet_id: tweet.id) 18 tweet_update_db user_id,tweet 19 else 20 tweet_add_db user_id,tweet 21 end 22 max_id = tweet.id 23 } 24 break if is_break #一週間以内のものでなければbreak 25 #*********↑ここまで↑*********# 26}

試したこと

配列の並列処理などと同じように出来るのではないかと考え、「Thread」や「Parallel」などのキーワードで調べて見ましたが、理解不足のため、うまく実装する事が出来ませんでした。
上記メソッドを使えば実現できるのではないか?と考えていたのですが、

client.user_timeline(user_id, count:200, max_id:max_id, include_rts: false, exclude_replies: false).each {|tweet|
の部分を、
Parallel.each(client.user_timeline(user_id, count:200, max_id:max_id, include_rts: false, exclude_replies: false), :in_threads=>2) {|tweet|

に書き換える等、試して見ましたが、ツイートの取得さえできませんでした。

補足情報(FW/ツールのバージョンなど)

rails 5.1.6
ruby 2.4.0

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問