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