python数据挖掘常用的几种大数据存储格式

来源:互联网 发布:数据库查询学号去重复 编辑:程序博客网 时间:2024/05/02 00:36

一直想找个机会好好学习下这块的知识,但是毕竟实践出真知,下面的就按照我自己使用过的一点点补充吧^^

pickle 存储对象

项目中常用pickle,不了解前以为是多么高大上的东西,了解之后发现并不神秘,用一句话概括就是持久化操作。之前做java那么久,还是第一次接触python的持久化操作,明显还是跟java的持久化机制差了一大截。
虽然简单,但是pickle真的很好用,因为他可以保存训练了一半的模型,下次接着训练!厉害吧!

 import Cpickle as pickle #python2 import pickle #python3

怎么用 dump and load:

基本接口:
pickle.dump(obj, file, [,protocol])
注解:将对象obj保存到文件file中去。
protocol为序列化使用的协议版本,0:ASCII协议,所序列化的对象使用可打印的ASCII码表示;1:老式的二进制协议;2:2.3版本引入的新二进制协议,较以前的更高效。其中协议0和1兼容老版本的python。protocol默认值为0。
file:对象保存到的类文件对象。file必须有write()接口, file可以是一个以’w’方式打开的文件或者一个StringIO对象或者其他任何实现write()接口的对象。如果protocol>=1,文件对象需要是二进制模式打开的。

pickle.load(file)
注解:从file中读取一个字符串,并将它重构为原来的python对象。
file:类文件对象,有read()和readline()接口。

>>> a1 = 'apple'  >>> b1 = {1: 'One', 2: 'Two', 3: 'Three'}  >>> c1 = ['fee', 'fie', 'foe', 'fum']  >>> f1 = file('temp.pkl', 'wb')  >>> pickle.dump(a1, f1, True)  >>> pickle.dump(b1, f1, True)  >>> pickle.dump(c1, f1, True)  >>> f1.close()  >>> f2 = file('temp.pkl', 'rb')  >>> a2 = pickle.load(f2)  >>> a2  'apple'  >>> b2 = pickle.load(f2)  >>> b2  {1: 'One', 2: 'Two', 3: 'Three'}  >>> c2 = pickle.load(f2)  >>> c2  ['fee', 'fie', 'foe', 'fum']  >>> f2.close()  

我用的时候:

pickle.dump(encoder, open('../../models/encoder.pkl', 'wb'))

除此之外我还遇到了一个错误,pickle在load一个训练了一半的模型的时候报EOFError,查了一下发现原来是因为我写入的时候是’wb’写入,但读的时候是用的’r’,应该用’rb’,代表着二进制格式读写。最好这样写下:

with open(model.model_history_fname,'rb') as f:    # net.train_history_ = pickle.load(f)    try:        net.train_history_=pickle.load(f)    except EOFError:        net.train_history_ = None

pickle操作还有一些复杂一点的对象操作,感觉在数据挖掘中不太常用,我是没用过啦,就不细看了~

numpy.memmap内存映射方式

将大文件分成小段读写,而不是一次性读入整个文件,节约内存空间。后悔比赛的时候一次都没试过,后面总是溢出溢出,那时候只求用最快的方式投机取巧的解决,哎,丧失了最好的学习机会。

使用函数np.memmap并传入一个文件路径、数据类型、形状以及文件模式,即可创建一个新的memmap:
memmap(filename,dtype=uint8,mode=“r+”,offset=0,shape,order=‘C’)
其中,offset是文件中存储数据的起始位置;mode可以是c(不写入的修改)r+(可读写)w+(创建或是覆盖已有文件)。
我用的时候:

X_fp = np.memmap(X_fname, dtype=np.float32, mode='w+', shape=X_shape)

发现这个可以和csv读写结合在一起,起到边读边写的效果,操作就是用iterrows按行读取文件,然后每一行都flush存储。看了下内存几乎没有消耗,超级赞。
创建后是纯0的,对memmap切片将会返回磁盘上的数据的视图:

section = mmap[:5]

如果将数据赋值给这些视图:数据会先被缓存在内存中(就像是Python的文件对象),调用flush即可将其写入磁盘。

section[:] = np.random.randn(5, 10000)mmap.flush()del mmap

在使用的时候它和ndarray几乎没有区别。
有几个notes:

The memmap object can be used anywhere an ndarray is accepted. Given a memmap fp, isinstance(fp, numpy.ndarray) returns True.
Memory-mapped files cannot be larger than 2GB on 32-bit systems.

读的时候只要把mode改成mode=’r’就可以了,我用的时候:

X = np.memmap(X_fname, dtype=np.float32, mode=’r’, shape=X_shape)

原创粉丝点击