2011-11-15 34 views
1

我有一個R函數,它使用RCurl庫和getURLContent()函數通過它的API調用Web服務器數據庫。我經常循環重複調用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

不幸的是,網絡服務器由提供API的外部服務運行。我只是通過R訪問API。Best迄今爲止我已經在sapply函數循環中添加了一個Sys.sleep(.1)。 – cboettig

回答

1

我唯一的``通用''建議將是確保curl保持與請求之間的服務器活動連接。 HTTP協議的這個功能稱爲保持活動狀態。我讀了一些curl實現默認這樣做。但我不知道你使用的是哪個版本。這不會減少由PHP生成的服務器負載,但它會減少與每個請求相關的開銷,因此也可以加快您的R代碼。

+0

謝謝 - 但我相信我已經通過傳遞getCurlHandle的值來做到這一點(我認爲)。我同意在不傳遞curl選項的情況下重複調用getURLContent會涉及更多開銷,因爲每次調用都會調用getCurlHandle的新調用。 (忘記了,我忘記了本地記憶)。除非我誤解了該選項的作用? – cboettig

+0

getCurlHandle有助於保持活力。我的主要內存問題來自RCurl的一個版本,我知道它並沒有正確運行垃圾收集。 RCurl的最新版本顯着提高了性能。 – cboettig