用R下载整个比特币交易链

gua*_*osr 5 r bitcoin

我在这里很新,所以提前感谢你的帮助.我正在尝试对整个比特币交易链进行一些分析.为了做到这一点,我正在尝试创建2个表

1)所有比特币地址及其余额的完整列表,即:

| ID | Address     | Balance  |
-------------------------------
| 1  | 7d4kExk...  | 32       |
| 2  | 9Eckjes...  | 0        |
| .  | ...         | ...      |

2)比特币网络中任意两个地址之间发生的交易数量的记录

| ID | Sender      | Receiver      | Transactions |
--------------------------------------------------
| 1  | 7d4kExk...  | klDk39D...    | 2            |
| 2  | 9Eckjes...  | 7d4kExk...    | 3            |
| .  | ...         | ...           | ..           |

为此,我在R中编写了一个(可能非常低效)脚本,它遍历每个块并擦除blockexplorer.com来编译表.到目前为止,我已经尝试过运行它几次,但我遇到了两个主要问题

1 - 这很慢......我可以想象它至少需要花一周的时间才能达到它的速度

2 - 我没有能够在没有它的情况下运行它超过一天或两天.它似乎只是冻结了RStudio.

我真的会在两个方面表达你的帮助:

1 - 在R中有更好的方法来使代码运行得更快吗?

2 - 我是否应该完全停止使用R并尝试不同的方法?

在此先感谢您的帮助!请参阅下面我正在使用的相关代码块

url_start <- "http://blockexplorer.com/b/"
url_end <- ""

readUrl <- function(url) {  
  table <- try(readHTMLTable(url)[[1]])
  if(inherits(table,"try-error")){
    message(paste("URL does not seem to exist:", url))
    errors <- errors + 1
    return(NA)
  } else {
    processed <- processed + 1
    return(table)
  }

}

block_loop <- function (end, start = 0) {

...

  addr_row <- 1 #starting row to fill out table
  links_row <- 1 #starting row to fill out table      

  for (i in start:end) {
    print(paste0("Reading block: ",i))
    url <- paste(url_start,i,url_end, sep = "")
    table <- readUrl(url)

    if(is.na(table)){ next } 

....
Run Code Online (Sandbox Code Playgroud)

jcl*_*ncy 3

您提到的网站上有接近 250,000 个区块(至少 260,000 个区块会给出 404)。从我的连接进行卷曲(下降 1 MB/秒)的平均速度约为半秒。从命令行亲自尝试一下(只需复制并粘贴),看看会得到什么:

curl -s -w "%{time_total}\n" -o /dev/null http://blockexplorer.com/b/220000

我假设你的请求和我的请求一样快。半秒乘以 250,000 等于 125,000 秒,即一天半。这绝对是使用任何方法都能获得的最佳结果,因为您必须请求该页面。

现在,在做了一次之后install.packages("XML"),我发现跑步readHTMLTable(http://blockexplorer.com/b/220000)平均需要大约五秒。5 秒乘以 250,000 等于 125 万秒,大约是两周。所以你的估计是正确的;这真的非常非常慢。作为参考,我运行的是 2011 款 MacBook Pro,配备 2.2 GHz Intel Core i7 和 8GB 内存 (1333 MHz)。

其次,R 中的表合并非常慢。假设每个表行有 100 条记录(看起来大约是平均值),您将拥有 2500 万行,其中一些行中包含 1 KB 的数据。假设您可以将该表放入内存中,那么连接表将是一个问题。

我最熟悉的解决这些问题的方法是使用Python代替R,使用BeautifulSoup4代替readHTMLTable,使用Pandas代替R的dataframe。BeautifulSoup 速度快(安装 lxml,一个用 C 编写的解析器)并且易于使用,Pandas 也非常快。它的数据帧类是根据 R 的数据帧类建模的,因此您可能可以很好地使用它。如果你需要一些东西来请求 URL 并返回 HTML 供 BeautifulSoup 解析,我建议使用 Requests。它精简而简单,并且文档也很好。这些都是pip install可以的。

如果你仍然遇到问题,我唯一能想到的就是一次获取内存中 1% 的数据,统计性地减少它,然后继续处理下一个 1%。如果您使用的机器与我的类似,您可能没有其他选择。