我需要乘以[2 ^ 14 x 2 ^ 14]个矩阵.但首先,让我们谈谈[2 ^ 12 x 2 ^ 12]矩阵.我需要多少内存?假设它是双矩阵,所以我需要8个字节用于一个元素.
((2 ^ 12*2 ^ 12*8)/ 2 ^ 20)*3 = 384 MiB
这是最糟糕的情况,当我需要将所有三个矩阵存储在内存中时.
haskell需要多少内存?让我们来看看.
-> let m n = matrix (2^n) (2^n) ( \(i, j) -> (fromIntegral i) * (fromIntegral j) ) :: Matrix Double
-> let p n = let r = m n in multStd2 r r ! (n,n)
-> p 12
3.299742941184e12
(4.84 secs, 1,991,404,304 bytes)
Run Code Online (Sandbox Code Playgroud)
它是~2 GiB.为什么这么糟糕,除了使用C++我该怎么办?
UPD:
我正在使用标准的haskell的Data.Matrix模块.
两点.
您正在寻找"未装箱"的阵列(或矢量或矩阵或其他),而不是"盒装"阵列.未装箱的阵列具有与C相同的平面表示,而装箱阵列是指向存储在阵列外部的堆对象的指针数组.作为额外空间使用的交换,盒装数组可以存储任何类型的元素,还可以存储未评估的值,使其内容不严格.对于与机器字相同大小的类型(假设为64位系统)Double,盒装数组通常使用的空间是未装箱数组的三倍.
数字"1,991,404,304字节"并不代表您认为它意味着什么.它实际上是在计算期间分配的总内存量.这并没有说明任何时候使用的最大空间量(除了它小于2GB).对于峰值空间使用值,运行+RTS -s并在程序完成时查看输出中的"最大驻留"值.