我在这里很新,所以提前感谢你的帮助.我正在尝试对整个比特币交易链进行一些分析.为了做到这一点,我正在尝试创建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)
您提到的网站上有接近 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%。如果您使用的机器与我的类似,您可能没有其他选择。
| 归档时间: |
|
| 查看次数: |
1910 次 |
| 最近记录: |