大的numpy矩阵记忆体问题

时间:2018-06-22 04:51:53

标签: python arrays numpy matrix memory-management

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

我正在对与我相关的一些基本的numpy操作进行时间测试。

我做了以下

n = 5000
j = defaultdict()
for i in xrange(n):
    print i
    j[i] = np.eye(n)

发生的是,python的内存使用量几乎立即达到6gigs,占我内存的90%以上。但是,数字打印速度稳定,大约每秒10-20次。在打印数字时,内存使用量偶尔会反弹至约4个演出,然后回升至5个,回落至4个,直至6个,再下降至4.5个,依此类推。 在1350次迭代中,我遇到了细分错误。

所以我的问题是,这段时间实际上发生了什么?这些矩阵实际上是一次创建的吗?为什么内存使用量会激增?

我的第二个问题是,实际上我可能需要在正在开发的程序中执行类似的操作。我将循环进行基本的算术运算和许多大型矩阵之间的比较。这些矩阵有时(但很少会)密集。它们通常会很稀疏。

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

关于是否必须遍历许多矩阵并在它们之间进行基本算术的任何建议?

谢谢。

1 个答案:

答案 0 :(得分:1)

  

如果我实际上需要5000个5000x5000矩阵,那么6 GB的内存是否可行?

如果它们是密集矩阵,那么您需要同时全部使用它们,而不用长时间拍摄。考虑:

compress3(Unpacked, Packed) :-
  Large #>= Small, Small #> 0,
  length(Unpacked, Large),
  label([Small, Large]),
  length(Packed, Small),
  compress(Unpacked, Packed).

一次创建一个矩阵。当您接近6GB时,会发生什么情况取决于您的平台。它可能会开始交换到磁盘,从而降低系统的爬网速度。可能存在固定大小或最大大小的交换,因此最终无论如何它都会耗尽内存。它可能会假设您将如何使用内存,并猜测在给定的任何时刻总会有空间适合您的实际工作集,而仅在发现无法使用时出现段错误。但是要做的一件事就是高效地工作。


您说您的大多数矩阵都是稀疏的。在这种情况下,请使用sparse matrix表示形式之一。如果您知道5000中的哪一个是密集矩阵,则可以混合并匹配密集矩阵和稀疏矩阵,但是如果不知道,则对所有东西都使用相同的稀疏矩阵类型。如果这意味着您偶尔使用密集矩阵需要210MB而不是200MB,但是所有其余矩阵都需要1MB而不是200MB,那么这是一个值得权衡的事情。


此外,您实际上是否需要同时处理所有5000个矩阵?例如,如果每个步骤仅需要当前矩阵和上一个矩阵,则可以即时生成它们(或即时从磁盘读取),而只需要400MB而不是1TB。


最坏的情况是,您可以使用某种缓存规则(例如最近最少使用)来有效地手动交换内容。例如,您可以轻松地将最后16个矩阵保留在内存中。在每个标记上保留一个脏标志,以便您知道在冲洗它是否为另一个矩阵腾出空间时是否必须保存它。这将变得很棘手。