2017-06-01 86 views
0

我试图使用bigmemory R中计算距离矩阵超过100,00,000(粗略估计)行16列R:distm大内存

数据的一小部分看起来像这样

list1 <- data.frame(longitude = c(80.15998, 72.89125, 77.65032, 77.60599, 
            72.88120, 76.65460, 72.88232, 77.49186, 
            72.82228, 72.88871), 
        latitude = c(12.90524, 19.08120, 12.97238, 12.90927, 
           19.08225, 12.81447, 19.08241, 13.00984, 
           18.99347, 19.07990)) 
list2 <- data.frame(longitude = c(72.89537, 77.65094, 73.95325, 72.96746, 
            77.65058, 77.66715, 77.64214, 77.58415, 
            77.76180, 76.65460), 
        latitude = c(19.07726, 13.03902, 18.50330, 19.16764, 
           12.90871, 13.01693, 13.00954, 12.92079, 
           13.02212, 12.81447), 
        locality = c("A", "A", "B", "B", "C", "C", "C", "D", "D", "E")) 


library(geosphere) 

# create distance matrix 
mat <- distm(list1[,c('longitude','latitude')], list2[,c('longitude','latitude')], fun=distHaversine) 

# assign the name to the point in list1 based on shortest distance in the matrix 
list1$locality <- list2$locality[max.col(-mat)] 

如何使用bigmemory构建海量的dist矩阵?

+0

如果这个项目是可行的,我怀疑它会像这样:创建并清空类型为double的大矩阵,它是您需要的大小(100M X 100M)或具有适当行数的3列矩阵。您可以在小插曲中看到使用所需文件后备将其保存到磁盘的示例。然后编写一个循环来填充它。在'biganalytics'包中或者'bigmemory'本身可能有一些有用的工具,但是你可能只需要求一个嵌套的for循环来填充矩阵。 – lmo

+1

100M x 100M并不现实,100K x 100K已经占用74.5GB。 如果你只需要访问距离,你应该在线计算它们。尽管如此,我认为计算距离的“big.matrix”的最好方法是逐块计算它们作为标准R矩阵(只有下三角和对角线上的块)。 –

+0

矩阵是100k + x 16.我有很多行 –

回答

2

像这样的事情对我的作品:

library(bigmemory) 
library(foreach) 

CutBySize <- function(m, block.size, nb = ceiling(m/block.size)) { 
    int <- m/nb 
    upper <- round(1:nb * int) 
    lower <- c(1, upper[-nb] + 1) 
    size <- c(upper[1], diff(upper)) 
    cbind(lower, upper, size) 
} 

seq2 <- function(lims) { 
    seq(lims[1], lims[2]) 
} 

n <- nrow(list1) 
a <- big.matrix(n, n, backingfile = "my_dist.bk", 
       descriptorfile = "my_dist.desc") 

intervals <- CutBySize(n, block.size = 1000) 
K <- nrow(intervals) 

doParallel::registerDoParallel(parallel::detectCores()/2) 
foreach(j = 1:K) %dopar% { 
    ind_j <- seq2(intervals[j, ]) 
    foreach(i = j:K) %do% { 
    ind_i <- seq2(intervals[i, ]) 
    tmp <- distm(list1[ind_i, c('longitude', 'latitude')], 
       list2[ind_j, c('longitude', 'latitude')], 
       fun = distHaversine) 
    a[ind_i, ind_j] <- tmp 
    a[ind_j, ind_i] <- t(tmp) 
    NULL 
    } 
} 
doParallel::stopImplicitCluster() 

我重复您的列表1000次10K行测试。

+0

当我有一个行数为1314525的文件时,它给出我这个错误'CreateFileBackedBigMatrix(as.character(backingfile),as.character(backingpath),错误': 问题创建文件备份矩阵.' –

+0

问题是,您的代码适用于10k行但不适用于100k行,它不是创建矩阵 –

+1

与1M3行,文件的大小为13TB ... –