各位好:
有一个矩阵对象location包含三列,ID和经纬度,长度为18289,
[data]
ID lon lat
320503 31.29530 120.5735
310104 31.18852 121.4365
310115 31.22152 121.5444
110105 39.92147 116.4431
[/data]
随之,需要计算他们两两location ID之间的Haversine distance,在geosphere包里有个函数distm可以生成两两ID曲面距离的对称矩阵,完成这个任务:
data.distance <- distm(location[, 2:3]
但是,由于数据量太大(18289*18289),R报错内存不足;
如是,采用ff package,
data.distance.ff <- ff(0, dim = c(18289, 18289))
也是没有问题.
但是,当把数据赋值到ff矩阵中时,仍然出现R报错内存不足
data.distance.ff[1:18289, 1:18289] <- distm(location[, 2:3]
</p>
Error: cannot allocate vector of size 2.5 Gb
In addition: Warning messages:
1: In matrix(0, ncol = n, nrow = n) :
Reached total allocation of 2047Mb: see help(memory.size)
2: In matrix(0, ncol = n, nrow = n) :
Reached total allocation of 2047Mb: see help(memory.size)
3: In matrix(0, ncol = n, nrow = n) :
Reached total allocation of 2047Mb: see help(memory.size)
4: In matrix(0, ncol = n, nrow = n) :
Reached total allocation of 2047Mb: see help(memory.size)
接着,为了了解是否是不是ff对象也爆了,我试了
data.distance.ff[1:10000, 1:10000] <- distm(location[1:10000, 2:3]
发现报错的信息发生了变化,
Error: cannot allocate vector of size 772.1 Mb.</p>
想请教的问题如下:
1.对ff矩阵对象赋值的命令有没有问题?是不是对ff对象赋值要特别处理?比如邱怡轩老师,在《R 中大规模数据的整理与分析》中提到的用ff包中的ffvecapply进行赋值?
2.ff对象也满足不了存储要求吗?
3.清楚的知道distm函数产生的是对称阵,所以所需向量存储扩大一倍(不考虑对角线),但是怎么不用循环,使用apply系列计算两两ID之间的距离呢?
4.如果继续使用distm函数的话,有什么方法能解决问题呢?
在线等,各位老师对问题有不清楚的地方,即刻回复. so grateful for you help !