我在这里很新,所以提前感谢您的帮助。我正在尝试对整个比特币交易链进行一些分析。为了做到这一点,我正在尝试创建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 }
....
答案 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%。如果您使用的是类似我的机器,您可能没有其他选择。