python - 大型 numpy 矩阵内存问题

标签 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 的内存使用几乎立即飙升至 6Gigs,这超过了我内存的 90%。然而,数字打印速度稳定,大约每秒 10-20 个。当数字打印出来时,内存使用量偶尔会下降到约 4 GB,然后回升到 5、回落到 4、上升到 6、下降到 4.5,等等。 在 1350 次迭代时,我遇到了段错误。

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

我的第二个问题是,我实际上可能需要在我正在开发的程序中做这样的事情。我将在循环中进行基本算术以及许多大型矩阵之间的比较。这些矩阵有时(但很少)是稠密的。它们通常很稀疏。

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

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

谢谢。

最佳答案

If I actually need 5000 5000x5000 matrices, is that feasible with 6 gigs of memory?

如果它们是密集矩阵,并且您同时需要它们,而不是远距离。考虑:

5K * 5K = 25M cells
25M * 8B = 200MB (assuming float64)
5K * 200MB = 1TB
<小时/>

一次创建一个矩阵。当接近 6GB 时,会发生什么取决于您的平台。它可能会开始交换到磁盘,从而使系统速度变慢。可能存在固定大小或最大大小的交换,因此最终它会耗尽内存。它可能会假设您将如何使用内存,猜测在任何给定时刻总会有空间将您的实际工作集放入内存中,只有当它发现它不能时才会出现段错误。但它不会做的一件事就是高效工作。

<小时/>

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

<小时/>

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

<小时/>

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

关于python - 大型 numpy 矩阵内存问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50980852/

相关文章:

python - 在python中获取空格分隔的输入

arrays - 如何在 Cobol 中获取数组的大小?

c - 将值分配给数组并将其打印到控制台时遇到麻烦

python - Pandas系列到numpy数组转换错误

python - 从 C++ 矢量到 Numpy ndarray 的转换非常慢

C# 捕获 python.exe 输出并将其显示在文本框中

python - 从mysql数据库获取数据到python时如何编写检查空集的语句?

arrays - React Native 对象子映射在父映射内

python - numpy 数组的逐元素逻辑比较

python-2.7 - 无法让 scipy.io.wavfile.read() 工作