使用Python和NumPy的非常大的矩阵

时间:2009-06-28 00:32:22

标签: python matrix numpy

NumPy是一个非常有用的库,从使用它我发现它能够轻松处理相当大(10000 x 10000)的矩阵,但开始挣扎任何更大的东西(试图创建一个50000 x 50000的矩阵失败)。显然,这是因为大量的内存需求。

有没有办法在某种程度上在NumPy中创建巨大的矩阵(比如100万乘100万)(没有几TB的RAM)?

12 个答案:

答案 0 :(得分:89)

PyTables和NumPy是要走的路。

PyTables会将数据以HDF格式存储在磁盘上,并可选择压缩。我的数据集经常获得10倍压缩,这在处理数万或数亿行时非常方便。它也很快;我5岁的笔记本电脑可以在1,000,000行/秒的时间内处理类似SQL的GROUP BY聚合数据。对于基于Python的解决方案来说还不错!

再次以NumPy重新排列方式访问数据非常简单:

data = table[row_from:row_to]

HDF库负责读取相关的数据块并转换为NumPy。

答案 1 :(得分:54)

numpy.array s意在生活在记忆中。如果你想使用大于RAM的矩阵,你必须解决这个问题。您可以遵循至少两种方法:

  1. 尝试更有效的矩阵表示,利用矩阵具有的任何特殊结构。例如,正如其他人已经指出的那样,稀疏矩阵(具有大量零的矩阵)有高效的数据结构,如scipy.sparse.csc_matrix
  2. 修改算法以处理子矩阵。您只能从磁盘读取当前正在计算中使用的矩阵块。设计用于在集群上运行的算法通常以块为单位工作,因为数据分散在不同的计算机上,并且仅在需要时传递。例如,the Fox algorithm for matrix multiplication (PDF file)

答案 2 :(得分:30)

您应该可以使用numpy.memmap来存储映射磁盘上的文件。使用较新的python和64位机器,您应该拥有必要的地址空间,而无需将所有内容加载到内存中。操作系统应该只处理将部分文件保存在内存中。

答案 3 :(得分:24)

要处理稀疏矩阵,您需要位于scipy之上的numpy包 - 有关scipy的稀疏矩阵选项的详细信息,请参阅here给你。

答案 4 :(得分:11)

Stefano Borini的post让我调查了这种事情到底有多远。

This is it.它似乎基本上可以做你想要的。 HDF5将允许您存储非常大的数据集,然后以与NumPy相同的方式访问和使用它们。

答案 5 :(得分:5)

确保您使用的是64位操作系统和64位版本的Python / NumPy。请注意,在32位体系结构上,您通常可以处理3GB内存(内存映射I / O等损失约1GB)。

对于64位且大于可用RAM的数据集,您可以使用虚拟内存,但如果必须交换,情况会变慢。此外,内存映射(请参阅numpy.memmap)是一种在磁盘上处理大型文件而无需将其加载到内存中的方法,但同样,您需要使用64位地址空间才能使用它。 PyTables也将为您完成大部分工作。

答案 6 :(得分:5)

这有点像alpha,但http://blaze.pydata.org/似乎正在努力解决这个问题。

答案 7 :(得分:4)

您是否在询问如何处理没有太字节RAM的2,500,000,000个元素矩阵?

处理20亿个没有80亿字节RAM的项目的方法是不将矩阵保留在内存中。

这意味着更复杂的算法可以从文件系统中获取它们。

答案 8 :(得分:3)

有时,一个简单的解决方案是为矩阵项使用自定义类型。根据您需要的数字范围,您可以使用手册dtype,特别是您的商品。因为Numpy默认认为对象的最大类型,所以在许多情况下这可能是一个有用的想法。这是一个例子:

In [70]: a = np.arange(5)

In [71]: a[0].dtype
Out[71]: dtype('int64')

In [72]: a.nbytes
Out[72]: 40

In [73]: a = np.arange(0, 2, 0.5)

In [74]: a[0].dtype
Out[74]: dtype('float64')

In [75]: a.nbytes
Out[75]: 32

使用自定义类型:

In [80]: a = np.arange(5, dtype=np.int8)

In [81]: a.nbytes
Out[81]: 5

In [76]: a = np.arange(0, 2, 0.5, dtype=np.float16)

In [78]: a.nbytes
Out[78]: 8

答案 9 :(得分:1)

通常当我们处理大型矩阵时,我们将它们实现为Sparse Matrices

我不知道numpy是否支持稀疏矩阵,但我找到了this

答案 10 :(得分:1)

据我所知,numpy,不,但我可能错了。

我可以为您提出这种替代解决方案:在磁盘上写入矩阵并以块的形式访问它。我建议你HDF5文件格式。如果您需要它透明,您可以重新实现ndarray接口,将磁盘存储的矩阵分页到内存中。如果修改数据以在磁盘上同步它们,请务必小心。

答案 11 :(得分:-1)

您可以在Google Colab上运行代码。 Google Colab是免费的云服务,现在支持免费的GPU! 我可以在Google Colab上建立一个(870199 * 14425)矩阵,但无法在PC上运行它。

相关问题