我目前正在处理一个填充了collections.counter对象的2d numpy对象数组 每个计数器基本上都是直方图。
这一切都可以满足我的需求,使用较小的数据集但是数据集大约有5亿个单元格标记,内存使用量大约是120Gb,这有点高。
有趣的是numpy.save将它写入4gb文件,这让我觉得我可以做的更好。
有关如何减少内存使用量的任何建议。
我考虑过一个3d数组,但由于需要保留空数,因此需要更多内存。
我在构造数组时大量使用了counter.update,因此任何方法都需要快速/简洁的方式来获得类似的功能。
创建数据后的访问不是一个大问题,因为每个单元格我可以获得每个键的值 - 不需要字典索引。
下面是一个非常简化的示例,它生成一个与我上面描述的大致类似的小数据集。我的代码会更倾向于每个计数器的密钥更少,每个密钥的计数更高
def counterArray_init(v):
return collections.Counter([v])
e = np.random.random_integers(0,1500,[10,10])
row_len, col_len = e.shape
counterArray = np.zeros([row_len,col_len], dtype= object)
vinit = np.vectorize(counterArray_init)
counterArray[:,:] = vinit(e)
for row in xrange(1,row_len):
for col in xrange(0,col_len):
counterArray[row,col].update(counterArray[row - 1,col])
return counterArray
由于
编辑:我已经意识到在我的小型计数器中使用的键在一个小范围内。上面的随机示例代码不是这种行为的一个很好的例子。 因此,我正在研究使用填充了不同长度int数组的对象数组和一个存储每个int数组的最小键值的单独数组。这似乎是一个奇怪的解决方案,但初始测试看起来只使用了计数器方法使用的大约20%的内存。
答案 0 :(得分:1)
如果存在大量空计数,则稀疏矩阵表示可能是合适的,其中存储器使用与数组中非空元素的数量成比例。 SciPy对你所看到的内容提供了不错的支持:scipy.sparse
答案 1 :(得分:1)
我肯定会使用3D数组,因为键是整数。特定商品的最大数量是多少?如果它低于255,您还可以将数组的数据类型更改为8位。
答案 2 :(得分:0)