2012-04-25 81 views
6

我有一个稀疏的数组,似乎太大而无法在内存中有效地处理(2000x2500000,float)。我可以把它变成一个稀疏的lil_array(scipy),但是如果我尝试输出一个列或行压缩稀疏数组(A.tocsc(),A.tocsr()),我的机器内存耗尽(还有一个严重的不匹配4.4G文本文件和picilled lil array 12G中的数据 - 这将是一个更接近原始数据大小的磁盘格式)。numpy磁盘阵列上的大号

我可能会在未来讨论更大的阵列。

问题:处理大型磁盘阵列的最佳方法是什么,以便我可以透明地使用常规numpy函数。例如,沿行和列,矢量产品,最大值,最小值,切片等总和?

是pytables的路要走吗?有没有一个好的(快速)sql-numpy中间件层?磁盘阵列内置numpy的秘密?

在过去(略小)的数组中,我总是将长计算结果pickel-cached缓存到磁盘。这在阵列最终成为4G左右但不再成立时起作用。

+0

当你腌制你的数组时,你确定使用二进制协议吗?如果您使用默认的文本协议,那么这可能是大文件大小的原因。 – DaveP 2012-04-26 05:57:37

回答

2

我经常使用memory-mapped numpy arrays来处理多GB数字矩阵。我发现他们为我的目的工作得很好。显然,如果数据的大小超过RAM的数量,则必须小心访问模式以避免thrashing

+0

这可能是可行的,但对于稀疏数组来看似乎相当低效。有稀疏版本吗? – 2012-04-25 16:32:40

+0

@AnonyBak:不是我所知道的。然而,一个2000x100000的'float32'密集数组的大小只有800MB(在磁盘和内存中)。 – NPE 2012-04-25 19:22:57

+0

是的,我的原始问题中存在拼写错误。它应该说2000x2500000。 – 2012-04-25 22:33:06