问题描述
我有一个 .csv 文件,其中包含与比特币钱包相关的近 100 万笔交易的交易 ID(发送和接收的交易),我将其作为数据表读入 R。现在我正在尝试向表中添加另一列,列出每笔交易的费用。这可以使用 API 调用来完成。
比如要拿到txid 73336c8b2f8bbf9c4165de515765463d6e835a9f3f87bf822d8bcb23c074ae7f的手续费,我要开: https://blockchain.info/q/txfee/73336c8b2f8bbf9c4165de515765463d6e835a9f3f87bf822d8bcb23c074ae7f 并直接读取那里的数据。
我所做的:首先,我使用 Excel 编辑了 .csv 文件,为每一行的 url 添加了一个新列。然后用R写了如下代码:
for(i in 1:nrow(transactions))
transactions$fee[i] <- scan(transactions$url[i])
但是这样它在 1 秒内只更新了 2-3 行。由于我是新手,所以必须有更有效的方法来做同样的事情。
解决方法
我们可以通过使用 scan()
比 curl::curl_fetch_memory
做得更好(~15 倍),例如使用您的网址:
URL <- "https://blockchain.info/q/txfee/73336c8b2f8bbf9c4165de515765463d6e835a9f3f87bf822d8bcb23c074ae7f"
microbenchmark::microbenchmark(
times = 50L,scan = scan(URL,what = integer(),quiet = TRUE),GET = as.integer(httr::content(httr::GET(URL))),curl = as.integer(rawToChar(curl::curl_fetch_memory(URL)$content))
)
# Unit: microseconds
# expr min lq mean median uq max neval
# scan 9388.292 9885.680 10216.9262 10164.120 10502.839 11016.553 50
# GET 7195.900 7611.485 8342.2855 7832.446 7948.521 22781.104 50
# curl 511.834 565.067 611.4956 610.391 642.799 790.482 50
identical(
scan(URL,as.integer(rawToChar(curl::curl_fetch_memory(URL)$content))
)
# [1] TRUE
注意:我使用了 integer
,因为您的特定网址适合,但 as.numeric
可能更合适。
话虽如此,我仍然认为访问网络是最大的瓶颈,您可能会发现尝试一次获得超过 1 笔交易的有效负载会有一些回报。否则,最大的性能提升将来自并行化。