我使用 dist()
中的R
函数创建了欧氏距离矩阵。
下面是我的R
脚本。由于在16809 * 16809
中运行此脚本时矩阵的维度为R
,因此收到错误消息:
错误:无法分配大小为1.1 Gb的矢量
那么有什么方法可以摆脱这个错误吗?
我之前没有在R
中使用并行化。可以使用并行化来完成吗?
rnd.points = matrix(runif(3 * 16809), ncol = 3)
rnd.points <- rnd.points[1:5,]
ds <- dist(rnd.points)
as.matrix(ds) -> nt
nt
答案 0 :(得分:1)
正如@Gopola所说:dist(.)
计算所有成对距离,因此需要
O(n ^ 2)个记忆。实际上,dist()
是有效的,只存储对称n x n矩阵的 half 。
如果我在具有足够RAM的计算机上计算dist(),它可以很好地工作,并且确实会创建一个大小为1.1 Gb的对象ds
...这不是所以大今天的电脑。
rnd.points <- matrix(runif(3 * 16809), ncol = 3)
ds <- dist(rnd.points)
object.size(ds)
但请注意您的
as.matrix(ds) -> nt
不是一个好主意,因为结果矩阵nt
确实(几乎)是ds
的两倍,因为nt
当然是基质
答案 1 :(得分:0)
O / S在RAM
上有主要限制 - 寻址(对于32位系统较小,对于64位系统较大)
O / S接下来有一个基于设计的限制,最后RAM
进程可以分配(+ kill
- s之后)
InRAM
约束,超出了当然,需要付出一些代价,但这是值得的经验。
python numpy
为这个场景无缝内置了一个很棒的功能 - .memmap()
。有意识地强调了这个词,因为这对于您的问题重新制定/重新设计成本至关重要。有工具可用,但是你需要掌握它们并重新设计你的算法(库等),因为这些可以使用新工具 - 猜猜 - SEAMLESSLY 。这是冰山的隐藏部分。
R
工具: filebacked.big.matrix
,它还支持用于分布式处理的HPC群集范围共享(从而解决 PSPACE
和 PTIME
HPC处理挑战的维度,除非您幸运地达到文件系统fileSize
上限
ff
,允许library(ff)
pt_coords <- ff( vmode = "double", dim = c(16809, 3), initdata = 0 )
pt_dists <- ff( vmode = "double", dim = c(16809, 16809), initdata = -1 )
>并以与矩阵相似的[row,column]
模式一样简单地处理它们以填充点并处理它们的成对距离等等,
有关保存结果距离数据的更多详细信息,请?ffsave
最后,但并非最不重要
mmap
+索引PTIME
:如filebacked.big.matrix
所述,有可能将计算PSPACE
分段为较小的段以进行分布式处理和减少PTIME
,但概念原则上只是一个并发(re) ) - 使用可用的资源,而不是[PARALLEL]系统行为(虽然有必要承认,许多营销(坏消息是即使技术营销加入了这种不公平和明知不正确的做法)文本误用地方中的并行/并行一词,其中观察到一个并发的系统行为(没有很多真实的,真正的PARALLEL系统)。
R
可以在 InRAM
限制之外使用大矩阵,选择最适合您的问题域的工具并利用所有您可以使用HPC资源。
Error: cannot allocate vector of size 1.1 Gb
已解决。
除了资源之外,只有资源可以限制和延迟我们的计算就绪任务,所以当计算资源仍然可用于您的项目时,请不要犹豫,否则您将发现自己,所有的重新设计好的软件就绪,但在队列中等待计算资源。