python使用稀疏矩阵节省内存实例
来源: 阅读:664 次 日期:2016-06-24 09:23:53
温馨提示: 小编为您整理了“python使用稀疏矩阵节省内存实例”,方便广大网友查阅!

这篇文章主要介绍了python使用稀疏矩阵节省内存实例,矩阵中非零元素的个数远远小于矩阵元素的总数,并且非零元素的分布没有规律,则称该矩阵为稀疏矩阵,需要的朋友可以参考下。

推荐系统中经常需要处理类似user_id,item_id,rating这样的数据,其实就是数学里面的稀疏矩阵,scipy中提供了sparse模块来解决这个问题,但scipy.sparse有很多问题不太合用:

1、不能很好的同时支持data[i,...]、data[...,j]、data[i,j]快速切片;

2、由于数据保存在内存中,不能很好的支持海量数据处理。

要支持data[i,...]、data[...,j]的快速切片,需要i或者j的数据集中存储;同时,为了保存海量的数据,也需要把数据的一部分放在硬盘上,用内存做buffer。这里的解决方案比较简单,用一个类dict的东西来存储数据,对于某个i(比如9527),它的数据保存在dict['i9527']里面,同样的,对于某个j(比如3306),它的全部数据保存在dict['j3306']里面,需要取出data[9527,...]的时候,只要取出dict['i9527']即可,dict['i9527']原本是一个dict对象,储存某个j对应的值,为了节省内存空间,我们把这个dict以二进制字符串形式存储,直接上代码:

代码如下:

'''

sparsematrix

'''

importstruct

importnumpyasnp

importbsddb

fromcstringioimportstringio

classdictmatrix():

def__init__(self,container={},dft=0.0):

self._data=container

self._dft=dft

self._nums=0

def__setitem__(self,index,value):

try:

i,j=index

except:

raiseindexerror('invalidindex')

ik=('i%d'%i)

#为了节省内存,我们把j,value打包成字二进制字符串

ib=struct.pack('if',j,value)

jk=('j%d'%j)

jb=struct.pack('if',i,value)

try:

self._data[ik]+=ib

except:

self._data[ik]=ib

try:

self._data[jk]+=jb

except:

self._data[jk]=jb

self._nums+=1

def__getitem__(self,index):

try:

i,j=index

except:

raiseindexerror('invalidindex')

if(isinstance(i,int)):

ik=('i%d'%i)

ifnotself._data.has_key(ik):returnself._dft

ret=dict(np.fromstring(self._data[ik],dtype='i4,f4'))

if(isinstance(j,int)):returnret.get(j,self._dft)

if(isinstance(j,int)):

jk=('j%d'%j)

ifnotself._data.has_key(jk):returnself._dft

ret=dict(np.fromstring(self._data[jk],dtype='i4,f4'))

returnret

def__len__(self):

returnself._nums

def__iter__(

测试代码:

代码如下:

importtimeit

timeit.timer('foo=__main__.data[9527,...]','import__main__').timeit(number=1000)

消耗1.4788秒,大概读取一条数据1.5ms。

更多信息请查看脚本栏目
由于各方面情况的不断调整与变化, 提供的所有考试信息和咨询回复仅供参考,敬请考生以权威部门公布的正式信息和咨询为准!
关于我们 | 联系我们 | 人才招聘 | 网站声明 | 网站帮助 | 非正式的简要咨询 | 简要咨询须知 | 加入群交流 | 手机站点 | 投诉建议
工业和信息化部备案号:滇ICP备2023014141号-1 云南省教育厅备案号:云教ICP备0901021 滇公网安备53010202001879号 人力资源服务许可证:(云)人服证字(2023)第0102001523号
云南网警备案专用图标
联系电话:0871-65317125(9:00—18:00) 获取招聘考试信息及咨询关注公众号:hfpxwx
咨询QQ:526150442(9:00—18:00)版权所有:
云南网警报警专用图标
Baidu
map