r - 在大矩阵中计算欧几里得距离的最有效方法
问题描述
我想找到在大矩阵上计算欧几里德距离的最节省内存和时间的方法。我在下面运行了这个小基准测试,比较了我知道的几个包:parallelDist
、geodist
和. 我也考虑过这个结合了和的自定义函数。这是我找到的结果(下面的代表),但我想知道是否有其他有效的 pacakges / 解决方案来完成这项任务:fields
stats
Rcpp
bigmemory
结果
benchmrk
#> package time alloc
#>1: parDist 0.298 5.369186e-04
#>2: fields 1.079 9.486198e-03
#>3: rcpp 54.422 2.161113e+00
#>4: stats 0.770 5.788603e+01
#>5: geodist 2.513 1.157635e+02
# plot
ggplot(benchmrk, aes(x=alloc , y=time, color= package, label=package)) +
geom_label(alpha=.5) +
coord_trans(x="log10", y="log10") +
theme(legend.position = "none")
代表
library(parallelDist)
library(geodist)
library(fields)
library(stats)
library(bigmemory)
library(Rcpp)
library(lineprof)
library(geobr)
library(sf)
library(ggplot2)
library(data.table)
# data input
df <- geobr::read_weighting_area()
gc(reset = T)
# convert projection to UTM
df <- st_transform(df, crs = 3857)
# get spatial coordinates
coords <- suppressWarnings(st_coordinates( st_centroid(df) ))
# prepare customized rcpp function
sourceCpp("euc_dist.cpp")
bigMatrixEuc <- function(bigMat){
zeros <- big.matrix(nrow = nrow(bigMat)-1,
ncol = nrow(bigMat)-1,
init = 0,
type = typeof(bigMat))
BigArmaEuc(bigMat@address, zeros@address)
return(zeros)
}
### Start tests
perf_fields <- lineprof(dist_fields <- fields::rdist(coords) )
perf_geodist <- lineprof(dist_geodist <- geodist::geodist(coords, measure = "cheap") )
perf_stats <- lineprof(dist_stats <- stats::dist(coords) )
perf_parDist <- lineprof(dist_parDist <- parallelDist::parDist(coords, method = "euclidean") )
perf_rcpp <- lineprof(dist_rcpp <- bigMatrixEuc( as.big.matrix(coords) ) )
perf_fields$package <- 'fields'
perf_geodist$package <- 'geodist'
perf_stats$package <- 'stats'
perf_parDist$package <- 'parDist'
perf_rcpp$package <- 'rcpp'
# gather results
benchmrk <- rbind(perf_fields, perf_geodist, perf_stats , perf_parDist, perf_rcpp)
benchmrk <- setDT(benchmrk)[, .(time =sum(time), alloc = sum(alloc)), by=package][order(alloc)]
benchmrk
解决方案
推荐阅读
- apache-spark - 如何使用 pyspark 将列表添加到 RDD
- flask - 使用 Flask 时,为什么要使用 url_for() 方法来提供静态文件?为什么不能只使用相对路径?
- javascript - Highcharts 本地 CSV 问题
- recursion - 与python龟相比,超过了最大递归深度
- python - 为什么最大递归调用会出现此错误?
- spring-boot - 例外:oracle.jdbc.driver.T4CConnection.isValid(I)Z 尝试使用 Spring Boot 访问 Oracle 时
- google-bigquery - Postgres 函数作为 BigQuery 中的过程的正确过程语法?
- java - Java代码用IntStream翻转图像,二维数组?
- javascript - 如何将 HTML 转换为 PDF 并与 expo 共享 pdf 文件 react native share (ios) with printToFileAsync
- python - 使用python返回一个非定向路径图