hickle, 基于HDF5的python pickle替换

分享于 

6分钟阅读

GitHub

  繁體 雙語
a HDF5 based python pickle replacement
  • 源代码名称:hickle
  • 源代码网址:http://www.github.com/telegraphic/hickle
  • hickle源代码文档
  • hickle源代码下载
  • Git URL:
    git://www.github.com/telegraphic/hickle.git
    Git Clone代码到本地:
    git clone http://www.github.com/telegraphic/hickle
    Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/telegraphic/hickle
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
    

    Build Status

    给 3用户提供了注释: 一些实验 python 3支持已经添加,并需要从 python 3用户( 开发者也) 输入。 你将需要使用开发分支。

    给贡献者说明:请向开发部门提供任何贡献。 在开发分支达到稳定的版本之前,主分支已经被冻结,冻结。 感谢你的输入。

    Hickle

    Hickle是基于HDF5的基于的克隆,具有扭曲。 Hickle转储到HDF5文件,而不是序列化到pickle文件。 它被设计为"放入"( 对于通用数据对象)的替换。 这就是把 python 变量放到文件中的简单方法。 Hickle快速,允许你对数据( lzf/gzip ) 进行透明压缩。

    为什么使用 Hickle?

    虽然hickle被设计成 pickle ( 和 json )的替代品,但它的工作方式却很不同。 它不是序列化/json化的,而是使用优秀的h5py模块存储数据。

    使用hickle的主要原因是:

    • 它比pickle和cPickle快
    • 它在HDF5中存储数据
    • 你可以轻松地压缩数据。

    不使用hickle的主要原因是:

    • 你不希望将数据存储在HDF5中。 虽然hickle可以序列化任意 python 对象,但是该功能只为方便提供,你可能只需要使用pickle模块就可以了。
    • 你想在JSON中转换数据。 为此,请使用json或者 uJson。

    所以,如果你想要你的数据在 HDF5,或者如果你的洗涤过长,给hickle试试。 Hickle对于存储大型tds数组非常好,感谢在下运行的h5py。

    性能比较

    Hickle运行的速度比sip快,它的默认设置比 protocol=2 设置的快速更快一点:

    In [1]: import numpy as np
    In [2]: x = np.random.random((2000, 2000))
    In [3]: import pickle
    In [4]: f =open('foo.pkl', 'w')
    In [5]: %time pickle.dump(x, f) # slow by defaultCPU times: user 2 s, sys: 274 ms, total: 2.27 s
    Wall time: 2.74 s
    In [6]: f =open('foo.pkl', 'w')
    In [7]: %time pickle.dump(x, f, protocol=2) # actually very fastCPU times: user 18.8 ms, sys: 36 ms, total: 54.8 ms
    Wall time: 55.6 ms
    In [8]: import hickle
    In [9]: f =open('foo.hkl', 'w')
    In [10]: %time hickle.dump(x, f) # a bit fasterdumping <type'numpy.ndarray'> to file<HDF5file"foo.hkl" (mode r+)>CPU times: user 764 µs, sys: 35.6 ms, total: 36.4 ms
    Wall time: 36.2 ms

    因此,如果继续使用 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 变量的内容,它是一个不错的选择。

    安装指南( 用于Linux和Mac操作系统)。

    简单方法

    通过在 命令行 中运行 pip install hickle 来安装 pip

    手动安装

    你应该安装 python 2.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 clone https://github.com/telegraphic/hickle.git 通过手动下载: 转到 https://github.com/telegraphic/hickle,在右边,你会找到 Download ZIP 文件

    cd到下载的hickle 目录

    然后在 hickle 目录中运行以下命令: python setup.py install

    用法示例

    Hickle是非常好的,易于使用,并且应该看起来非常熟悉以前的那些:

    import osimport hickle as hklimport numpy as np# 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 fileassert array_hkl.dtype == array_obj.dtypeassert np.all((array_hkl, array_obj))

    压缩选项

    hickle将关键字参数传递给 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 了解这些关键字的解释。


    BASE  rep  repl  替换  pick  replacement  
    相关文章