通过从变量 url 读取数据来向 data.table 添加列的最佳方法

问题描述

我有一个 .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 笔交易的有效负载会有一些回报。否则,最大的性能提升将来自并行化。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...