情境
我有一个程序,它将使用给定的值列表构建矩阵! 并且列表开始变得更大,如列表中的10万或数百万个值,这反过来将导致百万x百万大小矩阵。
在程序中,我在矩阵上做一些add / sub / div / multiply操作,基于行,列或只是元素。
问题
因为矩阵是如此之大,以至于我认为在记忆中完成整个操作都会有效。
问题
因此,我的问题是: 我应该如何操纵这个巨大的矩阵和巨大的价值表? 比如,在哪里存储它,如何阅读它等等,以便我可以在矩阵上执行我的操作,而计算机不会卡住或任何东西。
答案 0 :(得分:2)
我建议使用NumPy。算术运算速度非常快。
答案 1 :(得分:1)
你考虑过使用字典吗?如果矩阵非常稀疏,则将其存储为
是可行的matrix = {
(101, 10213) : "value1",
(1099, 78933) : "value2"
}
答案 2 :(得分:1)
首先,这样的矩阵将具有10G元素。考虑到对于任何有用的操作,您将需要30G元素,每个元素占用4-8个字节,您不能假设在使用任何内存技术的32位计算机上完成此操作。要解决这个问题,我会使用a)真正的64位机器,b)用于存储的内存映射二进制文件,以及c)ditch python。
正如我在下面计算的那样,如果你有2个输入矩阵和1个输出矩阵,100000 x 100000 32位浮点/整数元素,那就是120 GB(尽管不是GiB)的数据。假设在家用计算机上可以实现恒定的100 MB / s I / O带宽,矩阵的每个元素都需要访问任何操作,包括加法和减法,操作的绝对下限为120 GB /(100对于单个矩阵运算,MB / s)= 1200秒或20分钟。用C语言编写,尽可能高效地使用操作系统,memmap IO等等。对于百万分之一的元素,每个操作需要100倍的时间,即1.5天。由于硬盘在此期间已经饱和,计算机可能完全无法使用。
答案 3 :(得分:0)
数组不支持您的数据结构,它太大了。如果矩阵是例如二进制矩阵,则可以查看其存储的表示,例如将较大的零块散列到同一个桶中。