5

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

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

| 身份证 | 地址 | 余额 |
-------------------------------------------
| 1 | 7d4kExk... | 32 |
| 2 | 9Eckjes... | 0 |
| . | ... | ... |

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

| 身份证 | 发件人 | 接收器 | 交易 |
--------------------------------------------------
| 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 } 

....
4

1 回答 1

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

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

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

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

于 2013-08-15T06:15:36.140 回答