Python 大numpy矩阵内存问题

Python 大numpy矩阵内存问题,python,arrays,numpy,matrix,memory-management,Python,Arrays,Numpy,Matrix,Memory Management,我有两个问题,但第一个优先 我在做一些与我相关的基本numpy操作的timeit测试 我做了以下几件事 n = 5000 j = defaultdict() for i in xrange(n): print i j[i] = np.eye(n) 所发生的事情是,python的内存使用几乎立即飙升到6Gig,占我内存的90%以上。然而,数字以稳定的速度打印出来,大约每秒10-20次。当数字被打印出来时,内存使用量偶尔会下降到~4 Gig,然后上升到5 Gig,下降到4 Gig,

我有两个问题,但第一个优先

我在做一些与我相关的基本numpy操作的timeit测试

我做了以下几件事

n = 5000
j = defaultdict()
for i in xrange(n):
    print i
    j[i] = np.eye(n)
所发生的事情是,python的内存使用几乎立即飙升到6Gig,占我内存的90%以上。然而,数字以稳定的速度打印出来,大约每秒10-20次。当数字被打印出来时,内存使用量偶尔会下降到~4 Gig,然后上升到5 Gig,下降到4 Gig,上升到6 Gig,下降到4.5 Gig,以此类推。 在1350次迭代时,我有一个分段错误

所以我的问题是,在这段时间里到底发生了什么?这些矩阵是否一次创建一个?为什么内存使用会上下波动

我的第二个问题是,我可能真的需要在我正在工作的程序中做类似的事情。我将在一个循环中做一些基本的算术和许多大型矩阵之间的比较。这些矩阵有时(但很少)是稠密的。它们通常是稀疏的

如果我实际需要5000个5000x5000矩阵,那么使用6 Gig内存是否可行?我不知道用所有可用的工具和技巧可以做什么。。。也许我只需要将其中的一些存储在磁盘上,然后将它们分块取出

如果我必须循环许多矩阵并在它们之间进行基本运算,有什么建议吗

多谢各位

如果我实际需要5000个5000x5000矩阵,那么使用6 Gig内存是否可行

如果它们是稠密矩阵,你需要同时使用它们,而不是很长时间。考虑:

5K * 5K = 25M cells
25M * 8B = 200MB (assuming float64)
5K * 200MB = 1TB

一次创建一个矩阵。当您接近6GB时,会发生什么取决于您的平台。它可能会开始切换到磁盘,使您的系统缓慢爬行。可能会有固定大小或最大大小的交换,因此最终还是会耗尽内存。它可能会假设您将如何使用内存,猜测在任何给定时刻都会有空间将您的实际工作集放入内存中,但当它发现它不能时,它会自动切换。但它唯一不能做的就是高效地工作


你说你的大多数矩阵都是稀疏的。在这种情况下,请使用其中一种表示法。如果您知道5000个矩阵中的哪一个是稠密矩阵,您可以混合和匹配稠密矩阵和稀疏矩阵,但如果不知道,只需对所有矩阵使用相同的稀疏矩阵类型即可。如果这意味着您偶尔使用的密集矩阵占用210MB而不是200MB,但所有其他矩阵占用1MB而不是200MB,那么作为一种折衷,这是非常值得的


另外,你真的需要同时处理所有5000个矩阵吗?如果在每个步骤中只需要当前矩阵和上一个矩阵,则可以动态生成它们(或动态从磁盘读取),并且只需要400MB而不是1TB



在最坏的情况下,您可以使用某种缓存规则(如最近使用的缓存)手动有效地交换内容。比如说,你可以很容易地将最后16个矩阵保存在内存中。在每个矩阵上保留一个脏标记,以便在刷新时知道是否必须保存它,以便为另一个矩阵腾出空间。这是一个非常棘手的问题。

如果它们通常是稀疏的,那么解决方法非常简单:使用对象。偶尔密集的矩阵会稍微大一点,但稀疏的矩阵会小几个数量级,这将大大弥补差异。你是在对这些矩阵进行两两比较吗?如果你能稍微解释一下你在用这些工具做什么,也许会有所帮助,以防有一些不太占用内存的方法来解决你的问题。这些方法不能解决你的内存问题,但可以在GPU上运行矩阵运算,并观察你的工作速度明显加快。矩阵表示随着时间的推移图形的遍历。我真的不想插手此事。。但是我将要做的操作是行比较,MxN联合(做M行的联合…而不是求和),然后还要做M行的和。你是说每个矩阵内的单独操作,还是说跨多个矩阵的操作?