Octave - 内存不足或尺寸太大而不适合Octave的索引类型

时间:2017-08-25 12:22:48

标签: windows matrix memory out-of-memory octave

我知道有3个问题有类似的异常消息。不幸的是,没有一个问题得到解答,评论无法解决我的问题。

我在Windows 10系统上使用64位版本的Octave 4.2.1,总共16 GB RAM和运行时大约11 GB空闲。 当我尝试将60000 x 10矩阵乘以10 x 60000矩阵时,Octave会出现以下异常:

  

错误:对于Octave的索引类型

,内存或维度太大

这种乘法会产生60000 x 60000矩阵,因此64位索引不应该是一个问题。 我甚至不能zeros(60000,60000);

我不知道我做错了什么。有人能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:5)

通常情况下,这个错误经常被误解(也许我们应该将其解决为八度音阶跟踪器上的错误;)

>> 60000*60000
ans =    3.6000e+09
>> intmax
ans = 2147483647
>> 60000*60000 > intmax
ans = 1

即。生成的60000x60000矩阵的元素数量大于系统支持的最大整数表示,因此无法使用整数索引对此类矩阵进行线性索引。

另外,为了使用实际的 64位索引,你需要以这种方式编译八度,因为这不是默认的,但不幸的是,这不是那么简单正如您所希望的那样,因为您还必须使用相应的64位支持库。更多关于here

话虽如此,如果你的矩阵本质上确实很稀疏,很可能会使用稀疏矩阵。如果没有,您实际上使用的是大数据',您需要找到变通方法,例如块处理/将大型数组映射到文件等。值得一读的是#&# 34;大数据"技术。不幸的是,octave似乎还不支持matlab的memmapfile命令,但你可以使用fwrite / fread / fseek来适当地模拟这个命令,以便从中读取适当的范围一个文件。