NumPy是一个非常有用的库,从使用它我发现它能够轻松处理相当大(10000 x 10000)的矩阵,但开始与更大的任何东西挣扎(试图创建一个50000 x 50000的矩阵)失败).显然,这是因为大量的内存需求.
有没有办法在某种程度上在NumPy中创建巨大的矩阵(比如100万乘100万)(没有几TB的RAM)?
PyTables和NumPy是要走的路.
PyTables将以HDF格式将数据存储在磁盘上,并具有可选的压缩功能.我的数据集经常获得10倍压缩,这在处理数万或数亿行时非常方便.它也很快; 我5岁的笔记本电脑可以在1,000,000行/秒的时间内处理类似SQL的GROUP BY聚合数据.基于Python的解决方案也不错!
再次将数据作为NumPy重新访问进行访问非常简单:
data = table[row_from:row_to]
HDF库负责读取相关的数据块并转换为NumPy.
numpy.array
s意在生活在记忆中.如果你想使用大于RAM的矩阵,你必须解决这个问题.您可以遵循至少两种方法:
尝试更有效的矩阵表示,利用矩阵具有的任何特殊结构.例如,正如其他人已经指出的那样,对于稀疏矩阵(具有大量零的矩阵),存在有效的数据结构scipy.sparse.csc_matrix
.
修改算法以处理子矩阵.您只能从磁盘读取当前正在计算中使用的矩阵块.设计用于在集群上运行的算法通常以块为单位工作,因为数据分散在不同的计算机上,并且仅在需要时传递.例如,用于矩阵乘法的Fox算法(PDF文件).
您应该能够使用numpy.memmap对磁盘上的文件进行内存映射.使用较新的python和64位机器,您应该拥有必要的地址空间,而无需将所有内容加载到内存中.操作系统应该只处理将部分文件保留在内存中.
要处理稀疏矩阵,您需要scipy
位于顶部的包numpy
- 请参阅此处以获取有关scipy
为您提供的稀疏矩阵选项的更多详细信息.
Stefano Borini的帖子让我调查了这种事情到底有多远.
就是这个. 它似乎基本上做你想要的.HDF5将允许您存储非常大的数据集,然后以与NumPy相同的方式访问和使用它们.
确保您使用的是64位操作系统和64位版本的Python/NumPy.请注意,在32位体系结构上,您通常可以处理3GB内存(内存映射I/O等损失约1GB).
使用64位和大于可用RAM的数组,您可以使用虚拟内存,但如果必须交换,情况会变慢.此外,内存映射(请参阅numpy.memmap)是一种在磁盘上处理大型文件而无需将其加载到内存中的方法,但同样,您需要使用64位地址空间才能使用它.PyTables也将为您完成大部分工作.
这有点像alpha,但http://blaze.pydata.org/似乎正在努力解决这个问题.