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通过post提交数据的方法
May 06 Python
Python写的一个简单监控系统
Jun 19 Python
pygame 精灵的行走及二段跳的实现方法(必看篇)
Jul 10 Python
Python简单实现自动删除目录下空文件夹的方法
Aug 29 Python
基于tensorflow加载部分层的方法
Jul 26 Python
详解python Todo清单实战
Nov 01 Python
Python模块的制作方法实例分析
Dec 21 Python
pytorch对梯度进行可视化进行梯度检查教程
Feb 04 Python
Python模块/包/库安装的六种方法及区别
Feb 24 Python
Python如何脚本过滤文件中的注释
May 27 Python
pycharm设置默认的UTF-8编码模式的方法详解
Jun 01 Python
解决python对齐错误的方法
Jul 16 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二维数组排序的3种方法和自定义函数分享
2014/04/09 PHP
PHP往XML中添加节点的方法
2015/03/12 PHP
PHP文件上传处理案例分析
2016/10/15 PHP
phpStudy配置多站点多域名和多端口的方法
2017/09/01 PHP
PHP配置ZendOpcache插件加速
2019/02/14 PHP
JavaScript访问样式表代码
2010/10/15 Javascript
异步加载script的代码
2011/01/12 Javascript
JavaScript字符串插入、删除、替换函数使用示例
2013/07/25 Javascript
jquery实现的一个文章自定义分段显示功能
2014/05/23 Javascript
nodeJS代码实现计算交社保是否合适
2015/03/09 NodeJs
Ionic实现页面下拉刷新(ion-refresher)功能代码
2016/06/03 Javascript
nodejs 的 session 简单使用
2016/06/06 NodeJs
前端框架Vue.js中Directive知识详解
2016/09/12 Javascript
浅谈JavaScript作用域和闭包
2017/09/18 Javascript
开源一个微信小程序仪表盘组件过程解析
2019/07/30 Javascript
JS 实现发送短信验证码的“59秒后重新发送验证短信”功能
2019/08/23 Javascript
js+canvas实现图片格式webp/png/jpeg在线转换
2020/08/22 Javascript
JavaScript如何操作css
2020/10/24 Javascript
[06:38]DOTA2怒掀电竞风暴 2013Chinajoy
2013/07/27 DOTA
[01:06:30]DOTA2-DPC中国联赛定级赛 Phoenix vs DLG BO3第二场 1月9日
2021/03/11 DOTA
深入解析Python中的__builtins__内建对象
2016/06/21 Python
Python中用字符串调用函数或方法示例代码
2017/08/04 Python
python中对二维列表中一维列表的调用方法
2020/06/07 Python
Html5大文件断点续传实现方法
2015/12/05 HTML / CSS
Adobe Html5 Extension开发初体验图文教程
2017/11/14 HTML / CSS
Html5页面内使用JSON动画的实现
2019/01/29 HTML / CSS
应届毕业生求职自荐书
2014/01/03 职场文书
村干部承诺书
2014/03/28 职场文书
地质工程专业毕业生求职信
2014/08/08 职场文书
结对共建协议书
2014/08/20 职场文书
四查四看整改措施
2014/09/19 职场文书
应收账款管理制度
2015/08/06 职场文书
教师纪律作风整顿心得体会
2016/01/23 职场文书
初中美术教学反思
2016/02/17 职场文书
2019广播稿怎么写
2019/04/17 职场文书
国产动画《万圣街》日语配音版制作决定!
2022/03/20 国漫