您的位置:首页 > 编程语言 > Python开发

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

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

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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息