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中类的定义、继承及使用对象实例详解
Apr 30 Python
Python_LDA实现方法详解
Oct 25 Python
python如何重载模块实例解析
Jan 25 Python
解决pip install的时候报错timed out的问题
Jun 12 Python
在Tensorflow中查看权重的实现
Jan 24 Python
Python Numpy,mask图像的生成详解
Feb 19 Python
Python 分布式缓存之Reids数据类型操作详解
Jun 24 Python
Python如何发送与接收大型数组
Aug 07 Python
plt.figure()参数使用详解及运行演示
Jan 08 Python
selenium如何定位span元素的实现
Jan 13 Python
python中numpy.empty()函数实例讲解
Feb 05 Python
python调用ffmpeg命令行工具便捷操作视频示例实现过程
Nov 01 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
jQuery中的RadioButton,input,CheckBox取值赋值实现代码
2014/02/18 PHP
CodeIgniter框架过滤HTML危险代码
2014/06/12 PHP
php中使用Ajax时出现Error(c00ce56e)的详细解决方案
2014/11/03 PHP
php实现每天自动变换随机问候语的方法
2015/05/12 PHP
php类的定义与继承用法实例
2015/07/07 PHP
WordPress主题制作之模板文件的引入方法
2015/12/28 PHP
PHP连接MYSQL数据库实例代码
2016/01/20 PHP
JavaScript使用cookie
2007/02/02 Javascript
基于jQuery实现表格数据的动态添加与统计的代码
2011/01/31 Javascript
完美兼容各大浏览器的jQuery插件实现图片切换特效
2014/12/12 Javascript
客户端验证用户名和密码的方法详解
2016/06/16 Javascript
JQuery Ajax WebService传递参数的简单实例
2016/11/02 Javascript
node.js中实现kindEditor图片上传功能的方法教程
2017/04/26 Javascript
自定义vue全局组件use使用、vuex的使用详解
2017/06/14 Javascript
解决JSON.stringify()自动将中文转译成unicode的问题
2018/01/05 Javascript
基于webpack4搭建的react项目框架的方法
2018/06/30 Javascript
vue删除html内容的标签样式实例
2018/09/13 Javascript
在vue项目中正确使用iconfont的方法
2018/09/28 Javascript
JS面试题大坑之隐式类型转换实例代码
2018/10/14 Javascript
javascript实现前端分页效果
2020/06/24 Javascript
JS相册图片抖动放大展示效果的示例代码
2021/01/29 Javascript
[34:44]Liquid vs TNC Supermajor 胜者组 BO3 第二场 6.4
2018/06/05 DOTA
Python BeautifulSoup中文乱码问题的2种解决方法
2014/04/22 Python
python TCP Socket的粘包和分包的处理详解
2018/02/09 Python
Python request操作步骤及代码实例
2020/04/13 Python
Django实现内容缓存实例方法
2020/06/30 Python
Python configparser模块封装及构造配置文件
2020/08/07 Python
HTML5 CSS3实现一个精美VCD包装盒个性幻灯片案例
2014/06/16 HTML / CSS
巴基斯坦电子产品购物网站:Home Shopping
2017/09/14 全球购物
巴西箱包、背包、钱包和旅行配件购物网站:Inovathi
2019/12/14 全球购物
历史专业毕业生的自我鉴定
2013/11/15 职场文书
甜品店创业计划书
2014/09/21 职场文书
学习十八届四中全会精神思想汇报
2014/10/23 职场文书
2014年助理政工师工作总结
2014/12/19 职场文书
美术教师个人总结
2015/02/06 职场文书
Python快速优雅的批量修改Word文档样式
2021/05/20 Python