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

Yan*_*lem 2 memory windows matrix 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);

我不明白我做错了什么.有人能指出我正确的方向吗?

Tas*_*nou 5

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

>> 60000*60000
ans =    3.6000e+09
>> intmax
ans = 2147483647
>> 60000*60000 > intmax
ans = 1
Run Code Online (Sandbox Code Playgroud)

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

另外,为了使用实际的 64位索引,你需要以这种方式编译八度音程,因为这不是默认值,但不幸的是,这并不像你希望的那样简单,因为你必须使用相应的64位支持库也是如此.更多关于这一点.

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

  • Tatsuro提供了一些具有实验性大阵列支持的非官方窗口版本​​(http://www.tatsuromatsuoka.com/octave/Eng/Win/)据我记得其他一些用户在线有64位*INDEXING*版本.Yannic可能会查看邮件列表以查找磁盘 (2认同)