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

时间:2013-08-15 05:31:49

标签: 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 } 

....

1 个答案:

答案 0 :(得分:3)

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

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)平均需要大约五秒钟。五秒钟250,000是125万秒,大约两周。所以你的估计是正确的;这真的非常慢。作为参考,我运行的2011 MacBook Pro配备2.2 GHz Intel Core i7和8GB内存(1333 MHz)。

接下来,R中的表合并非常慢。假设每个表行有100条记录(似乎是平均值),那么你将拥有2500万行,其中一些行中有一千万字的数据。假设您可以将此表放在内存中,连接表将是一个问题。

我最熟悉的解决这些问题的方法是使用Python而不是R,BeautifulSoup4而不是readHTMLTable,以及Pandas来取代R&#39的数据帧。 BeautifulSoup很快(安装lxml,用C编写的解析器)并且易于使用,而且Pandas也非常快。它的数据帧类是在R&#39之后建模的,所以你可能可以正常使用它。如果您需要某些内容来请求URL并返回要解析的BeautifulSoup的HTML,我建议请求。它精简而简单,文档也很好。所有这些都是pip install能够的。

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