hickle-基于hdf5的pickle版本

hickle的Python项目详细描述


Build StatusBuild statusJOSS Status

希克尔

hickle是基于HDF5pickle的克隆,有一个转折点:不是序列化到pickle文件, hickle转储到hdf5文件(分层数据格式)。它被设计为pickle(用于公共数据对象)的“插入式”替换,但是 实际上是h5pydill/pickle的混合体,具有扩展的功能。

也就是说:hickle是一种将python变量转储到hdf5文件的简单方法,在大多数编程中都可以读取这些文件 语言,不仅仅是python。Hickle速度很快,允许对数据进行透明压缩(LZF/GZIP)。

为什么用希克尔?

虽然hickle被设计成替代pickle(或类似json)的一个drop-in,但它的工作方式却大不相同。 它不是序列化/json,而是使用优秀的h5py模块存储数据。

使用hickle的主要原因是:

  1. 比泡菜和泡菜还快。
  2. 它在hdf5中存储数据。
  3. 你可以很容易地压缩你的数据。

不使用hickle的主要原因是:

  1. 您不想将数据存储在HDF5中。虽然hickle可以序列化任意python对象,但提供此功能只是为了方便,您最好使用pickle模块。
  2. 您想要用人类可读的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压缩。过滤器,如 shufflescaleoffset移动数据以提高压缩比,然后fletcher32计算校验和。 这些文件级选项是从数据模型中抽象出来的。

最近的更改

  • 2018年12月:接受《开放源码软件期刊》(JOSS)。
  • 2018年6月:Python3的主要重构和支持。
  • 2016年8月:增加了对scipy稀疏矩阵bsr_matrixcsr_matrixcsc_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安装。

手动安装

  1. 您应该安装Python2.7及更高版本

  2. 安装h5py (官方页面:http://docs.h5py.org/en/latest/build.html

  3. 安装HDF5 (官方页面:http://www.hdfgroup.org/ftp/HDF5/current/src/unpacked/release_docs/INSTALL

  4. 下载hickle: 通过终端:git克隆https://github.com/telegraphic/hickle.git 通过手动下载:转到https://github.com/telegraphic/hickle并在右侧找到Download ZIP文件

  5. CD到您下载的hickle目录

  6. 然后在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

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
我可以用C++代码使用java代码吗?   java使用JSR303在派生类中提供更具体的约束   java在这个查找唯一路径数算法中我做错了什么?   java如何为2个不同的服务提供商使用2个不同的SSL证书?   java在Gridview上绘制文本   java使用连接for循环构建字符串名   java StringBuilder拆分无法处理某些文件   java事件关注EditText   Java Web Start“找不到URL的缓存资源”   java程序从命令行运行的速度比在Eclipse中慢   java为什么HttpServletRequest会截断#字符上的url输入?   java自定义折叠工具栏平滑标题大小调整   使用Mockito对安卓 java中调用另一个静态函数的函数进行单元测试   http在java客户机中使用cachecontrol头   java如何使用。是否使用Delimiter从输入文件中排除标点符号和数字?   使用上下文作为参数/参数的java   java更有效地从Jar中提取文件   java为多个JButton提供相同的actionListener