【发布时间】:2018-01-31 08:34:12
【问题描述】:
问题描述
我有 45000 个短时间序列(长度为 9),想计算聚类分析的距离。我意识到这将导致(下三角形)一个大小为 45000x45000 的矩阵,一个包含超过 20 亿个条目的矩阵。不出所料,我得到:
> proxy::dist(ctab2, method="euclidean")
Error: cannot allocate vector of size 7.6 Gb
我能做什么?
想法
- 以某种方式增加可用/可寻址内存?但是,这些7.6G可能超出了一些无法扩展的硬限制?在任何情况下,系统都有 16GB 内存和相同数量的交换。 R 中的“Gb”似乎是指 Gigabyte,而不是 Gigabit,因此 7.6Gb 让我们已经危险地接近硬限制。
- 也许一种不同的距离计算方法而不是欧几里得,比如 DTW,可能更节省内存?但是,如下所述,内存限制似乎是生成的矩阵,而不是计算时所需的内存。
-
将数据集分成 N 个块并计算 N^2 个部分的矩阵(实际上只有那些与下三角形相关的部分),然后可以重新组合? (这可能看起来类似于here 提出的类似问题的解决方案。)不过,这似乎是一个相当混乱的解决方案。此外,我最终还是需要 45K x 45K 矩阵。然而,这似乎达到了极限。系统在生成45K x 45K随机矩阵时也给出了内存分配错误:
> N=45000; memorytestmatrix <- matrix( rnorm(N*N,mean=0,sd=1), N, N) Error: cannot allocate vector of size 15.1 Gb30K x 30K 矩阵可能没有问题,R 给出的结果大小为
> print(object.size(memorytestmatrix), units="auto") 6.7 Gb似乎多了 1 Gb,一切都会好起来的。可悲的是,我没有任何可以删除以腾出空间的大型对象。此外,具有讽刺意味的是,
> system('free -m') Warning message: In system("free -m") : system call failed: Cannot allocate memory我不得不承认我不确定为什么 R 拒绝分配 7.6 Gb;系统当然有更多的内存,虽然不多。
ps aux将 R 进程显示为单个最大的内存用户。即使有更多可用内存,R 可以处理多少内存也可能存在问题?
相关问题
- 其他与 R 内存不足相关的问题的答案,例如 this one,建议使用内存效率更高的计算方法。
- This very helpful answer 建议删除其他大对象,为内存密集型操作腾出空间。
- Here,建议拆分数据集并按块计算距离的想法。
软件和版本
R 版本是 3.4.1。系统内核为 Linux 4.7.6,x86_64(即 64 位)。
> version
_
platform x86_64-pc-linux-gnu
arch x86_64
os linux-gnu
system x86_64, linux-gnu
status
major 3
minor 4.1
year 2017
month 06
day 30
svn rev 72865
language R
version.string R version 3.4.1 (2017-06-30)
nickname Single Candle
编辑(8 月 27 日):更多信息
- 将 Linux 内核更新到 4.11.9 无效。
-
bigmemory 包也可能内存不足。它使用
/dev/shm/中的共享内存,系统默认情况下(但取决于配置)允许 RAM 的一半大小。您可以在运行时通过(例如)mount -o remount,size=12Gb /dev/shm来增加它,但这可能仍然不允许使用 12Gb。 (不知道为什么,可能内存管理配置不一致)。另外,you may end up crashing your system if you are not careful。 - R 显然实际上允许访问完整的 RAM,并且可以创建达到该大小的对象。对于特定功能,例如
dist,它似乎失败了。我将添加此作为答案,但我的结论有点基于猜测,所以我不知道这在多大程度上是正确的。
【问题讨论】:
-
你试过使用 R x64 吗?
-
@Kanak 是的,我在 x86_64 系统上。
version给... arch x86_64 ... -
我还检查了 R 中的指针大小:
> .Machine$sizeof.pointer,它给出了[1] 8,这反过来意味着它确实是 64 位的。 (指针大小在 32 位上为 4。)
标签: r memory memory-management time-series cluster-analysis