Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何操作存储为嵌套列表的巨大矩阵(100000x1000000)?_Python_List_Matrix - Fatal编程技术网

Python 如何操作存储为嵌套列表的巨大矩阵(100000x1000000)?

Python 如何操作存储为嵌套列表的巨大矩阵(100000x1000000)?,python,list,matrix,Python,List,Matrix,环境 我有一个程序,它将使用给定的值列表构造一个矩阵! 这个列表开始变大,比如一个列表中有10万或100万个值,这反过来会产生百万x百万大小的矩阵 在这个过程中,我对矩阵进行了一些加法/sub/div/乘法运算,可以基于行、列,也可以仅基于元素 问题 因为矩阵太大了,所以我认为在内存中进行整个操作是行不通的 问题 因此,我的问题是: 我应该如何操作这个巨大的矩阵和巨大的价值列表? 比如,在哪里存储它,如何读取它等等,这样我就可以在矩阵上执行操作,计算机就不会卡住或发生任何事情。你考虑过使用字典吗

环境

我有一个程序,它将使用给定的值列表构造一个矩阵! 这个列表开始变大,比如一个列表中有10万或100万个值,这反过来会产生百万x百万大小的矩阵

在这个过程中,我对矩阵进行了一些加法/sub/div/乘法运算,可以基于行、列,也可以仅基于元素

问题

因为矩阵太大了,所以我认为在内存中进行整个操作是行不通的

问题

因此,我的问题是: 我应该如何操作这个巨大的矩阵和巨大的价值列表?
比如,在哪里存储它,如何读取它等等,这样我就可以在矩阵上执行操作,计算机就不会卡住或发生任何事情。

你考虑过使用字典吗?如果矩阵非常稀疏,则可以将其存储为

matrix = {
 (101, 10213) : "value1",
 (1099, 78933) : "value2"
}

你考虑过用字典吗?如果矩阵非常稀疏,则可以将其存储为

matrix = {
 (101, 10213) : "value1",
 (1099, 78933) : "value2"
}

首先也是最重要的是,这样的矩阵将有10G的元素。考虑到任何有用的操作都需要30G元素,每个元素占用4-8个字节,因此不能假设在使用任何内存技术的32位计算机上执行此操作。为了解决这个问题,我将使用一台真正的64位机器,b内存映射的二进制文件进行存储,c使用python

使现代化
正如我在下面计算的,如果你有两个输入矩阵和一个输出矩阵,100000 x 100000 32位浮点/整数元素,也就是120GB,虽然数据不是很GiB。假设,在家用计算机上,您可以实现恒定的100 MB/s I/O带宽,任何操作(包括加法和减法)都需要访问矩阵的每个元素,对于单个矩阵操作,操作的绝对下限为120 GB/100 MB/s=1200秒或20分钟。用C编写,尽可能高效地使用操作系统,内存映射IO等等。对于百万乘百万的元素,每个操作需要100倍的时间,即1.5天。由于硬盘在这段时间内饱和,计算机可能完全无法使用。

首先,这样的矩阵将有10G元素。考虑到任何有用的操作都需要30G元素,每个元素占用4-8个字节,因此不能假设在使用任何内存技术的32位计算机上执行此操作。为了解决这个问题,我将使用一台真正的64位机器,b内存映射的二进制文件进行存储,c使用python

使现代化
正如我在下面计算的,如果你有两个输入矩阵和一个输出矩阵,100000 x 100000 32位浮点/整数元素,也就是120GB,虽然数据不是很GiB。假设,在家用计算机上,您可以实现恒定的100 MB/s I/O带宽,任何操作(包括加法和减法)都需要访问矩阵的每个元素,对于单个矩阵操作,操作的绝对下限为120 GB/100 MB/s=1200秒或20分钟。用C编写,尽可能高效地使用操作系统,内存映射IO等等。对于百万乘百万的元素,每个操作需要100倍的时间,即1.5天。由于硬盘在这段时间内饱和,计算机可能完全无法使用。

我建议使用。它的算术运算相当快。

我建议使用。算术运算速度非常快。

您的数据结构不可能使用数组,因为它太大了。例如,如果矩阵是二进制矩阵,您可以查看其存储的表示,比如将较大的零块散列到同一个存储桶中

您的数据结构不能与数组一起使用,它太大了。例如,如果矩阵是二进制矩阵,您可以查看其存储的表示,比如将较大的零块散列到同一个存储桶中

这是一个非常糟糕的想法——Python并不是为此而设计的。考虑使用例如C++,这是不可行的。告诉我们有关计算的情况。基质密集吗?矩阵描述了什么?如果是数字数据,不要使用Python列表。使用适当的数值数组类型,如numpy.array。此外,如果您的数据大部分为零,请使用稀疏矩阵。@David Heffernan,矩阵是稠密的。这是n个元素的成对比较,这是一个NxN矩阵。至于运算,我对每一行和每一列进行求和,对矩阵中的每个元素进行除法运算。@Li aung Yip,这是数值数据,不是稀疏矩阵。那我就换成numpy.array吧!这是一个非常糟糕的想法——Python并不是为此而设计的。考虑使用例如C++,这是不可行的。告诉我们有关计算的情况。基质密集吗?矩阵描述了什么?如果是数字数据,不要使用Python列表。使用适当的数值数组

类型,如numpy.array。此外,如果您的数据大部分为零,请使用稀疏矩阵。@David Heffernan,矩阵是稠密的。这是n个元素的成对比较,这是一个NxN矩阵。至于运算,我对每一行和每一列进行求和,对矩阵中的每个元素进行除法运算。@Li aung Yip,这是数值数据,不是稀疏矩阵。那我就换成numpy.array吧!你是说做矩阵乘法/加法吗?还是仅仅对单个元素进行操作?如果矩阵。。。你看过scipy.sparse吗?你是说做矩阵乘法/加法吗?还是仅仅对单个元素进行操作?如果矩阵。。。你看过scipy.稀疏吗?为什么要抛弃Python?有很多方法可以在Python中映射二进制数据,以及用于处理稀疏矩阵的库。好吧,不要在整个问题域中抛弃Python,只不过这个问题不应该在Python中完成。@DavidHeffernan,为什么不呢,100 GB的memmapped纯数据对于64位计算机来说很容易。这就是MongoDB的工作方式,工作的意义非常有限,但无论如何。矩阵加法和减法都是按行进行的,但矩阵乘法更像是个问题。不,我没说。无论如何,如果你仔细阅读,他想在不导致计算机挂起的情况下操纵10G元素矩阵等等,我想我感觉到了一个巨魔:你只需要等一段时间才能找到答案为什么要抛弃Python?有很多方法可以在Python中映射二进制数据,以及用于处理稀疏矩阵的库。好吧,不要在整个问题域中抛弃Python,只不过这个问题不应该在Python中完成。@DavidHeffernan,为什么不呢,100 GB的memmapped纯数据对于64位计算机来说很容易。这就是MongoDB的工作方式,工作的意义非常有限,但无论如何。矩阵加法和减法都是按行进行的,但矩阵乘法更像是个问题。不,我没说。无论如何,如果你仔细阅读,他想在不导致计算机挂起的情况下操纵10G元素矩阵等等,我想我感觉到了一个巨魔:你只需要等一段时间才能得到任何答案,我肯定会换成numpyPI肯定会切换到numpy!:P