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

Pet*_*ter 82 python numpy matrix

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

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

Ste*_*ons 89

PyTables和NumPy是要走的路.

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

再次将数据作为NumPy重新访问进行访问非常简单:

data = table[row_from:row_to]
Run Code Online (Sandbox Code Playgroud)

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

  • 注意显示这种方法的快速代码示例? (76认同)
  • 所以你仍然需要自己将数据分成几块进行处理?这只是一种简化磁盘文件转换的方法吗? (4认同)
  • 您是否有机会以更清晰的方式和一些示例来扩展您的答案? (2认同)

Rob*_*let 55

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

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

  • 3-逐步进入大数据范例并研究MapReduce等解决方案 (4认同)

Dop*_*ift 30

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

  • 您能举例说明如何使用它来做一些不适合内存的事情吗? (15认同)

Ale*_*lli 24

要处理稀疏矩阵,您需要scipy位于顶部的包numpy- 请参阅此处以获取有关scipy为您提供的稀疏矩阵选项的更多详细信息.


Sin*_*ion 11

Stefano Borini的帖子让我调查了这种事情到底有多远.

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

  • 更好的选择可能是PyTables.它比核心HDF5功能更高级别(H5Py只是可从Python访问的低级API).上周的2.2测试版也提供了解决这个问题的工具:http://www.pytables.org/moin/ReleaseNotes/Release_2.2b1添加了Expr,一个可以评估表达式的类(如'3*a + 4*b' )在优化资源的同时对任意大型阵列进行操作[...].它类似于Numexpr包,但除了NumPy对象之外,它还接受基于磁盘的同类数组,如Array,CArray,EArray和Column PyTables对象. (9认同)

dwf*_*dwf 5

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

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


wis*_*sty 5

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


Nic*_*kis 1

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

我不知道 numpy 是否支持稀疏矩阵,但我发现了这个