【发布时间】:2017-08-14 12:40:03
【问题描述】:
我编写了这个简短的代码,通过使用 freegeoip.net 自动对 IP 地址进行地理编码(默认情况下每小时 15,000 次查询;出色的服务!):
> library(RCurl)
Loading required package: bitops
> ip.lst =
c("193.198.38.10","91.93.52.105","134.76.194.180","46.183.103.8")
> q = do.call(rbind, lapply(ip.lst, function(x){
try( data.frame(t(strsplit(getURI(paste0("freegeoip.net/csv/", x)), ",")[[1]]), stringsAsFactors = FALSE) )
}))
> names(q) = c("ip","country_code","country_name","region_code","region_name","city","zip_code","time_zone","latitude","longitude","metro_code")
> str(q)
'data.frame': 4 obs. of 11 variables:
$ ip : chr "193.198.38.10" "91.93.52.105" "134.76.194.180" "46.183.103.8"
$ country_code: chr "HR" "TR" "DE" "DE"
$ country_name: chr "Croatia" "Turkey" "Germany" "Germany"
$ region_code : chr "" "06" "NI" ""
$ region_name : chr "" "Ankara" "Lower Saxony" ""
$ city : chr "" "Ankara" "Gottingen" ""
$ zip_code : chr "" "06450" "37079" ""
$ time_zone : chr "Europe/Zagreb" "Europe/Istanbul" "Europe/Berlin" ""
$ latitude : chr "45.1667" "39.9230" "51.5333" "51.2993"
$ longitude : chr "15.5000" "32.8378" "9.9333" "9.4910"
$ metro_code : chr "0\r\n" "0\r\n" "0\r\n" "0\r\n"
在三行代码中,您可以获得所有 IP 的坐标,包括城市/国家代码。我想知道这是否可以并行化以使其运行得更快?否则,对超过 10,000 个 IP 进行地理编码可能需要数小时。
【问题讨论】:
-
不要这样做。当您拥有
rgeolocate可以在 5 秒内本地处理 100 万个 IP 时,就没有真正需要使用外部 API 服务了。 -
我不知道那个包。感谢您的链接。我认为 API 服务应该比读取 csv 文件快得多?
-
从一台机器并行化 API 调用很少会导致加速 - 限制因素通常是服务器响应,而不是 CPU 处理它们的速度。用多个请求敲击服务器,你会减慢响应速度,并获得更多的退出,然后被禁止:)
-
@T.Hengl 好吧,这是从本地数据库读取的 R 包中的本地 C++ 代码。它确实可以在 5 秒内(或更少,在某些系统上)对 100 万个 IP 地址进行地理编码。