Python使用稀疏矩阵节省内存实例


Posted in Python onJune 27, 2014

推荐系统中经常需要处理类似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以二进制字符串形式存储,直接上代码:

'''

Sparse Matrix

'''

import struct

import numpy as np

import bsddb

from cStringIO import StringIO

 

class DictMatrix():

    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:

            raise IndexError('invalid index')

 

        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:

            raise IndexError('invalid index')

 

        if (isinstance(i, int)):

            ik = ('i%d' % i)

            if not self._data.has_key(ik): return self._dft

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

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

 

        if (isinstance(j, int)):

            jk = ('j%d' % j)

            if not self._data.has_key(jk): return self._dft

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

 

        return ret

 

    def __len__(self):

        return self._nums

 

    def __iter__(

测试代码:

import timeit

timeit.Timer('foo = __main__.data[9527, ...]', 'import __main__').timeit(number = 1000)

消耗1.4788秒,大概读取一条数据1.5ms。
采用类Dict来存储数据的另一个好处是你可以随便用内存Dict或者其他任何形式的DBM,甚至传说中的Tokyo Cabinet….

好了,码完收工。

Python 相关文章推荐
Python创建日历实例
Aug 21 Python
Python单例模式实例分析
Jan 14 Python
Python之str操作方法(详解)
Jun 19 Python
python实现识别手写数字 python图像识别算法
Mar 23 Python
对python opencv 添加文字 cv2.putText 的各参数介绍
Dec 05 Python
对python中词典的values值的修改或新增KEY详解
Jan 20 Python
python统计中文字符数量的两种方法
Jan 31 Python
python 返回一个列表中第二大的数方法
Jul 09 Python
基于Python执行dos命令并获取输出的结果
Dec 30 Python
Python通过Pillow实现图片对比
Apr 29 Python
详解基于Facecognition+Opencv快速搭建人脸识别及跟踪应用
Jan 21 Python
只需要这一行代码就能让python计算速度提高十倍
May 24 Python
Python实现的百度站长自动URL提交小工具
Jun 27 #Python
python使用心得之获得github代码库列表
Jun 25 #Python
在Python中使用异步Socket编程性能测试
Jun 25 #Python
Python开发的单词频率统计工具wordsworth使用方法
Jun 25 #Python
python 字典(dict)遍历的四种方法性能测试报告
Jun 25 #Python
用python登录Dr.com思路以及代码分享
Jun 25 #Python
python正则表达式re模块详解
Jun 25 #Python
You might like
php顺序查找和二分查找示例
2014/03/27 PHP
PHP实现使用DOM将XML数据存入数组的方法示例
2017/09/27 PHP
JS类定义原型方法的两种实现的区别评论很多
2007/09/12 Javascript
JS getStyle获取最终样式函数代码
2010/04/01 Javascript
基于JQuery的简单实现折叠菜单代码
2010/09/15 Javascript
超级简单的jquery操作表格方法
2014/12/15 Javascript
jQuery的几个我们必须了解的特点
2015/05/03 Javascript
javascript类型系统 Window对象学习笔记
2016/01/07 Javascript
JavaScript获取IP获取的是IPV6 如何校验
2016/06/12 Javascript
AngularJS ng-bind-template 指令详解
2016/07/30 Javascript
深入理解React中es6创建组件this的方法
2016/08/29 Javascript
让浏览器崩溃的12行JS代码(DoS攻击分析及防御)
2016/10/10 Javascript
微信小程序 后台https域名绑定和免费的https证书申请详解
2016/11/10 Javascript
jQuery中的deferred使用方法
2017/03/27 jQuery
bootstrap模态框示例代码分享
2017/05/17 Javascript
React Native AsyncStorage本地存储工具类
2017/10/24 Javascript
JS 实现微信扫一扫功能
2018/09/14 Javascript
vue+vuex+json-seiver实现数据展示+分页功能
2019/04/11 Javascript
基于canvasJS在PHP中制作动态图表
2020/05/30 Javascript
Vue+Bootstrap收藏(点赞)功能逻辑与具体实现
2020/10/22 Javascript
Vue+scss白天和夜间模式切换功能的实现方法
2021/01/05 Vue.js
Python实现Pig Latin小游戏实例代码
2018/02/02 Python
Python 网络编程之UDP发送接收数据功能示例【基于socket套接字】
2019/10/11 Python
使用Python实现 学生学籍管理系统
2019/11/26 Python
Python如何获取Win7,Win10系统缩放大小
2020/01/10 Python
HTML5 Video/Audio播放本地文件示例介绍
2013/11/18 HTML / CSS
Marriott国际:万豪国际酒店查询预订
2017/09/25 全球购物
美国最大的烧烤架和户外生活用品专业零售商:Barbeques Galore
2021/01/09 全球购物
2015年元旦活动总结
2014/05/09 职场文书
医学专业毕业生推荐信
2014/07/12 职场文书
教师批评与自我批评材料
2014/10/16 职场文书
我在伊朗长大观后感
2015/06/16 职场文书
应收账款管理制度
2015/08/06 职场文书
班主任经验交流心得体会
2015/11/02 职场文书
Python数据清洗工具之Numpy的基本操作
2021/04/22 Python
javascript的var与let,const之间的区别详解
2022/02/18 Javascript