我的FTP服务器出现问题,在返回几个文件后速度会急剧下降。
我正在尝试从国家冰雪数据中心的政府服务器访问数据,使用R脚本和RCurl库,它是libcurl的包装器。我正在使用的代码行(作为目录列表的示例):
getBinaryURL(url="ftp://n5eil01u.ecs.nsidc.org/SAN/MOST/MOD10A2.005/2013.07.28/MOD10A2.A2013209.h26v04.005.2013218193414.hdf
或此示例,下载特定文件:
getURL()
我必须经常提出getBinaryURL()
和curl
请求,因为我正在浏览寻找特定文件的目录并在我去处理它们。
在每种情况下,服务器都会非常快速地返回前5个或6个文件(每个大约1 Mb),但是我的脚本通常需要等待10分钟或更长时间,直到下一个文件可用为止;在此期间服务器没有响应。如果我重新启动脚本或从OSX终端尝试{{1}},我会再次对前几个文件做出快速响应,然后是大幅减速。
我很确定服务器的行为与防止DOS攻击或限制机器人或无知用户使用的带宽有关。但是,我是新手,我不明白如何规避经济放缓。我问过维护服务器的人,但我还没有明确的答案。
问题:
假设这个问题不是特定服务器独有的,我的目标通常是保持同一个会话打开,还是开始每个FTP请求的新会话?服务器是否会使用cookie来识别我的会话?如果是这样,我想删除或修改cookie吗?我也不理解句柄的作用。
我为这种模糊道歉,但我在这里旷野徘徊。我会很感激任何指导,即使只是对现有资源。谢谢!
答案 0 :(得分:0)
解决方案是在发出每个FTP请求后释放curl句柄。然而,这起初并不起作用,因为即使它被移除,R也挂在手柄上。解决方案(由Bill Dunlap在R帮助列表中提供)是调用垃圾收集。总之,成功的代码看起来像这样:
for(file in filelist){
curl<-getCurlHandle() #create a new curl handle
getURL(url=file, curl=curl,...) #download the file
rm(curl) #remove the curl
gc() #the magic call to garbage collection, without which the above does not work
}
我仍然怀疑使用RCurl库可能有一种更优雅的方式来完成同样的事情,但至少可以这样做。