2011-11-15 3 views
1

RCurlライブラリとgetURLContent()関数を使用してAPIを使用してWebサーバーデータベースを呼び出すR関数があります。私はしばしば、サーバーに課税されるgetURLContent()への繰り返し呼び出しをループします。あまりにもサーバー上の要求を避けるために私はR/curlインターフェイスを通過できる何かはありますか?APIへの繰り返し呼び出しでサーバを過度に課税することを回避する方法R

ここでは、url [i]は、いくつかのAPIに対する異なるクエリに対応するベクトルのi番目のURLアドレスです。

curl = getCurlHandle() 
sapply(url, function(u) getURLContent(u, curl=curl)) 
+0

sapplyステートメントに一時停止を追加するのが最も簡単なことだと思います。これよりも賢明なものがあれば疑問に思っていますか? – cboettig

+0

ウェブサーバー上のコードを変更する権限はありますか?たとえば、複数の引数を取って単一のPHP URLにラップされたすべてのURLの処理を行うためにサーバー側のコードを変更できますか? –

+0

残念ながら、WebサーバーはAPIを提供する外部サービスによって実行されていません。私はRを介してAPIにアクセスしています。これまでSpp.sleep(.1)をサプリー関数ループに追加しています。 – cboettig

答えて

1

「一般的な」唯一の提案は、curlが要求と要求の間にサーバーへの接続を確実に維持することです。 HTTPプロトコルのこの機能はキープアライブと呼ばれます。私はいくつかのカールの実装がデフォルトでこれを行うことを読んでいます。しかし、あなたが使っているバージョンがわかりません。これにより、PHPで生成されたサーバーの負荷が軽減されますが、各要求に伴うオーバーヘッドが減少し、Rコードが高速化される可能性があります。

+0

ありがとう - しかし、私はすでにgetCurlHandleの値を渡してこれをやっていると思います。 curlオプションを渡さずにgetURLContentを繰り返し呼び出すことは、各呼び出しがgetCurlHandleへの新しい呼び出しを呼び出すため、より多くのオーバーヘッドを伴うことに同意します。 (私はそれを忘れてローカルメモリを使い果たした)。私がそのオプションの役割を誤解していない限り? – cboettig

+0

getCurlHandleはこれを生かしておくのに役立ちます。私の主なメモリの問題は、ガーベッジコレクションを正しく実行していなかったことを理解しているRCurlのバージョンから発生しました。 RCurlの最新バージョンは、パフォーマンスを飛躍的に向上させました。 – cboettig

関連する問題