hickle-基于hdf5的pickle版本
hickle的Python项目详细描述
希克尔
hickle是基于HDF5的pickle
的克隆,有一个转折点:不是序列化到pickle文件,
hickle转储到hdf5文件(分层数据格式)。它被设计为pickle(用于公共数据对象)的“插入式”替换,但是
实际上是h5py
和dill
/pickle
的混合体,具有扩展的功能。
也就是说:hickle
是一种将python变量转储到hdf5文件的简单方法,在大多数编程中都可以读取这些文件
语言,不仅仅是python。Hickle速度很快,允许对数据进行透明压缩(LZF/GZIP)。
为什么用希克尔?
虽然hickle
被设计成替代pickle
(或类似json
)的一个drop-in,但它的工作方式却大不相同。
它不是序列化/json,而是使用优秀的h5py模块存储数据。
使用hickle的主要原因是:
- 比泡菜和泡菜还快。
- 它在hdf5中存储数据。
- 你可以很容易地压缩你的数据。
不使用hickle的主要原因是:
- 您不想将数据存储在HDF5中。虽然hickle可以序列化任意python对象,但提供此功能只是为了方便,您最好使用pickle模块。
- 您想要用人类可读的json/yaml转换数据,在这种情况下,您应该这样做。
所以,如果你想你的数据在HDF5,或者如果你的腌制时间太长,给希克尔一个尝试。
hickle特别擅长存储大型numpy数组,这要归功于在引擎盖下运行的h5py
。
文档
hickle的文档可以在telegraphic.github.io/hickle/找到。
用法示例
希克尔是很好和容易使用,应该看起来很熟悉的那些你谁已经腌制过。
简而言之,hickle
提供了两种方法:ahickle.load
方法,用于加载hickle文件和hickle.dump
方法,用于将数据转储到hdf5中。下面是一个完整的示例:
importosimporthickleashklimportnumpyasnp# Create a numpy array of dataarray_obj=np.ones(32768,dtype='float32')# Dump to filehkl.dump(array_obj,'test.hkl',mode='w')# Dump data, with compressionhkl.dump(array_obj,'test_gzip.hkl',mode='w',compression='gzip')# Compare filesizesprint('uncompressed: %i bytes'%os.path.getsize('test.hkl'))print('compressed: %i bytes'%os.path.getsize('test_gzip.hkl'))# Load dataarray_hkl=hkl.load('test_gzip.hkl')# Check the two are the same fileassertarray_hkl.dtype==array_obj.dtypeassertnp.all((array_hkl,array_obj))
HDF5压缩选项
与pickle
相比,hickle
的一个主要优点是它允许花哨的hdf5特性
通过向h5py
传递关键字参数来应用。因此,您可以执行以下操作:
hkl.dump(array_obj,'test_lzf.hkl',mode='w',compression='lzf',scaleoffset=0,chunks=(100,100),shuffle=True,fletcher32=True)
关于这些关键字的详细解释见http://docs.h5py.org/en/latest/high/dataset.html, 但我们在下面给出一个简短的摘要。
在hdf5中,数据集存储为b-树,b-树是一种比相邻的树数据结构具有速度优势的树数据结构。
数据块。在b树中,数据被分成chunks,
它被用来允许dataset resizing和
通过filter pipelines压缩。过滤器,如
shuffle
和scaleoffset
移动数据以提高压缩比,然后fletcher32
计算校验和。
这些文件级选项是从数据模型中抽象出来的。
最近的更改
- 2018年12月:接受《开放源码软件期刊》(JOSS)。
- 2018年6月:Python3的主要重构和支持。
- 2016年8月:增加了对scipy稀疏矩阵
bsr_matrix
、csr_matrix
和csc_matrix
的支持。
性能比较
hickle的运行速度比pickle的默认设置快得多,比pickle的protocol=2
设置快得多:
In[1]:importnumpyasnpIn[2]:x=np.random.random((2000,2000))In[3]:importpickleIn[4]:f=open('foo.pkl','w')In[5]:%timepickle.dump(x,f)# slow by defaultCPUtimes:user2s,sys:274ms,total:2.27sWalltime:2.74sIn[6]:f=open('foo.pkl','w')In[7]:%timepickle.dump(x,f,protocol=2)# actually very fastCPUtimes:user18.8ms,sys:36ms,total:54.8msWalltime:55.6msIn[8]:importhickleIn[9]:f=open('foo.hkl','w')In[10]:%timehickle.dump(x,f)# a bit fasterdumping<type'numpy.ndarray'>tofile<HDF5file"foo.hkl"(moder+)>CPUtimes:user764us,sys:35.6ms,total:36.4msWalltime:36.2ms
因此,如果继续使用pickle,请添加protocol=2
关键字(感谢@mrocklin指出这一点)。
对于存储列表的python字典,hickle优于python json编码器,但比ujson慢。对于64个词条的字典,每个词条包含4096个长度的随机数列表,时间是:
json took 2633.263 ms
uJson took 138.482 ms
hickle took 232.181 ms
需要注意的是,这些比较当然是不公平的:用hdf5存储不会帮助您将某些内容转换为json,也不会帮助您序列化字符串。但是为了快速存储python变量的内容,这是一个非常好的选择。
安装指南
简易方法
从命令行运行pip install hickle
,使用pip
安装。
手动安装
您应该安装Python2.7及更高版本
安装h5py (官方页面:http://docs.h5py.org/en/latest/build.html)
安装HDF5 (官方页面:http://www.hdfgroup.org/ftp/HDF5/current/src/unpacked/release_docs/INSTALL)
下载
hickle
: 通过终端:git克隆https://github.com/telegraphic/hickle.git 通过手动下载:转到https://github.com/telegraphic/hickle并在右侧找到Download ZIP
文件CD到您下载的
hickle
目录然后在
hickle
目录中运行以下命令:python setup.py install
测试
从源代码安装后,运行python setup.py test
检查它是否正常工作。
错误和贡献
贡献和错误修复是非常受欢迎的。请查看我们的contribution guidelines 更多关于如何促进发展的细节。
引用hickle
如果你在学术研究中使用hickle
,如果你能在Journal of Open-Source Software (JOSS)中引用our paper,我们将不胜感激。
Price et al., (2018). Hickle: A HDF5-based python pickle replacement. Journal of Open Source Software, 3(32), 1115, https://doi.org/10.21105/joss.01115