Python p根据需要重新包装&x27;完整';指数

Python p根据需要重新包装&x27;完整';指数,python,pandas,pytables,Python,Pandas,Pytables,我正在尝试重新打包使用pandas HDFStore pytables接口创建的HDF文件。 dataframe的主要索引是time,但我制作了更多的列data\u columns,以便通过这些data\u列筛选磁盘上的数据 现在,我想使用带有sortby选项的ptrepack对HDF文件按其中一列进行排序(因为选择对我来说太慢了,84 GB文件),如下所示: ()[maye@luna4 .../nominal]$ ptrepack --chunkshape=auto --propindexes

我正在尝试重新打包使用pandas HDFStore pytables接口创建的HDF文件。 dataframe的主要索引是time,但我制作了更多的列
data\u columns
,以便通过这些data\u列筛选磁盘上的数据

现在,我想使用带有
sortby
选项的ptrepack对HDF文件按其中一列进行排序(因为选择对我来说太慢了,84 GB文件),如下所示:

()[maye@luna4 .../nominal]$ ptrepack --chunkshape=auto --propindexes --complevel=9 --complib=blosc --sortby=clat C9.h5 C9_sorted.h5
我得到了错误信息:

()[maye@luna4…/nominal]$将“C9.h5:/”复制到时出现问题 “C9_sorted.h5:/”错误为-->: 字段
clat
必须在表
/df/table中关联一个“完整”索引
(表(390557601,)”
。目标文件看起来像:C9_sorted.h5 (文件)“上次修改:”“2013年7月26日星期五18:17:56”对象树:/ (RootGroup)'/df(Group)'/df/table(table(0),shuffle,blosc(9)) ''

回溯(最近一次调用上次):文件 “/usr/local/epd/bin/ptrepack”,第10行,in sys.exit(main())文件“/usr/local/epd/lib/python2.7/site packages/tables/scripts/ptrepack.py”, 第480行,主 upgradeflavors=upgradeflavors)文件“/usr/local/epd/lib/python2.7/site packages/tables/scripts/ptrepack.py”, 第225行,抄袭儿童 raise RUNTIMERROR(“请检查节点名称是否正确”)RUNTIMERROR:请检查节点名称在中是否重复 如果需要,请添加--overwrite nodes标志 特别要注意,rootUEP并没有欺骗你


这是否意味着我不能按索引列对HDF文件进行排序,因为它们不是“完整”索引?

这里是一个完整的示例

使用数据列创建框架。将索引重置为完整索引。使用ptrepack 糟透了

In [16]: df = DataFrame(randn(10,2),columns=list('AB')).to_hdf('test.h5','df',data_columns=['B'],mode='w',table=True)

In [17]: store = pd.HDFStore('test.h5')

In [18]: store
Out[18]: 
<class 'pandas.io.pytables.HDFStore'>
File path: test.h5
/df            frame_table  (typ->appendable,nrows->10,ncols->2,indexers->[index],dc->[B])

In [19]: store.get_storer('df').group.table
Out[19]: 
/df/table (Table(10,)) ''
  description := {
  "index": Int64Col(shape=(), dflt=0, pos=0),
  "values_block_0": Float64Col(shape=(1,), dflt=0.0, pos=1),
  "B": Float64Col(shape=(), dflt=0.0, pos=2)}
  byteorder := 'little'
  chunkshape := (2730,)
  autoIndex := True
  colindexes := {
    "index": Index(6, medium, shuffle, zlib(1)).is_CSI=False,
    "B": Index(6, medium, shuffle, zlib(1)).is_CSI=False}

In [20]: store.create_table_index('df',columns=['B'],optlevel=9,kind='full')

In [21]: store.get_storer('df').group.table
Out[21]: 
/df/table (Table(10,)) ''
  description := {
  "index": Int64Col(shape=(), dflt=0, pos=0),
  "values_block_0": Float64Col(shape=(1,), dflt=0.0, pos=1),
  "B": Float64Col(shape=(), dflt=0.0, pos=2)}
  byteorder := 'little'
  chunkshape := (2730,)
  autoIndex := True
  colindexes := {
    "index": Index(6, medium, shuffle, zlib(1)).is_CSI=False,
    "B": Index(9, full, shuffle, zlib(1)).is_CSI=True}

 In [22]: store.close()

 In [25]: !ptdump -avd test.h5
/ (RootGroup) ''
  /._v_attrs (AttributeSet), 4 attributes:
   [CLASS := 'GROUP',
    PYTABLES_FORMAT_VERSION := '2.0',
    TITLE := '',
    VERSION := '1.0']
/df (Group) ''
  /df._v_attrs (AttributeSet), 14 attributes:
   [CLASS := 'GROUP',
    TITLE := '',
    VERSION := '1.0',
    data_columns := ['B'],
    encoding := None,
    index_cols := [(0, 'index')],
    info := {'index': {}},
    levels := 1,
    nan_rep := b'nan',
    non_index_axes := [(1, ['A', 'B'])],
    pandas_type := b'frame_table',
    pandas_version := b'0.10.1',
    table_type := b'appendable_frame',
    values_cols := ['values_block_0', 'B']]
/df/table (Table(10,)) ''
  description := {
  "index": Int64Col(shape=(), dflt=0, pos=0),
  "values_block_0": Float64Col(shape=(1,), dflt=0.0, pos=1),
  "B": Float64Col(shape=(), dflt=0.0, pos=2)}
  byteorder := 'little'
  chunkshape := (2730,)
  autoindex := True
  colindexes := {
    "index": Index(6, medium, shuffle, zlib(1)).is_csi=False,
    "B": Index(9, full, shuffle, zlib(1)).is_csi=True}
  /df/table._v_attrs (AttributeSet), 15 attributes:
   [B_dtype := b'float64',
    B_kind := ['B'],
    CLASS := 'TABLE',
    FIELD_0_FILL := 0,
    FIELD_0_NAME := 'index',
    FIELD_1_FILL := 0.0,
    FIELD_1_NAME := 'values_block_0',
    FIELD_2_FILL := 0.0,
    FIELD_2_NAME := 'B',
    NROWS := 10,
    TITLE := '',
    VERSION := '2.6',
    index_kind := b'integer',
    values_block_0_dtype := b'float64',
    values_block_0_kind := ['A']]
  Data dump:
[0] (0, [1.10989047288066], 0.396613633081911)
[1] (1, [0.0981650001268093], -0.9209780702446433)
[2] (2, [-0.2429293157073629], -1.779366453624283)
[3] (3, [0.7305529521507728], 1.243565083939927)
[4] (4, [-0.1480724789512519], 0.5260130757651649)
[5] (5, [1.2560020435792643], 0.5455842491255144)
[6] (6, [1.20129355706986], 0.47930635538027244)
[7] (7, [0.9973598999689721], 0.8602929579025727)
[8] (8, [-0.40070941088441786], 0.7622228032635253)
[9] (9, [0.35865804118145655], 0.29939126149826045)

我已经测试了杰夫在我们上面闲聊的讨论中提到的几个选项

请查看此笔记本,希望它能帮助您做出有关数据存储的决策: 笔记本的要点如下:

我的主要结论:

  • 使用index=False有几个令人印象深刻的效果:1.它减少了生成的HDF文件的文件大小。2.它创建HDF文件的速度要快得多。3.即使如此,ptdump和storer().group.table打印输出并没有显示任何索引,store显示仍然显示索引器和数据列(这可能是我忽略了pytables机制)
  • 通过store.create_table_index()创建索引对通过其中一个数据列选择数据的速度没有任何影响
  • 此索引必须是“完整”索引,以便稍后使用--sortby进行的ptrepack不会跳转。但它不必是索引级别9。默认级别6很好,并且似乎不会显著影响数据选择速度。可能会对许多列产生影响
  • 使用--propindex几乎使ptrepacking时间增加了一倍,数据选择速度略有提高
  • 使用压缩和--propindex只比单独使用--propindex稍微慢一点,而数据大小(至少在本例中)并没有显著下降
  • 使用压缩后,数据选择速度似乎没有太大差别
  • 在对选择列进行排序后,仅使用--sortby without--propindexes对该示例中的2列1百万行随机数据的加速比约为因子5
为了完成,命令的超短摘要:

df = pd.DataFrame(randn(1e6,2),columns=list('AB')).to_hdf('test.h5','df',
                  data_columns=list('AB'),mode='w',table=True,index=False)
store = pd.HDFStore('test.h5')
store.create_table_index('df',columns=['B'], kind='full')
store.close()
在外壳中:

ptrepack --chunkshape=auto --sortby=B test.h5 test_sorted.h5

我认为这是正确的。默认标记为'light',级别6 IIRC。请参阅。更改为级别9,'full'相当于创建一个CSI。您可以通过打印存储查看有关该表的更多信息。get_storer('df'))还可以试着省去-,我认为这可能与sortby不兼容,但当我省去Proptices时,我不能在磁盘上筛选数据,这是84 GB数据库文件的一个必要条件?哦,正如您所看到的,我没有检查CSI,所以该要求应该得到满足?sortby创建了新的指示,这就是为什么您不需要支持旧的索引hanks!当我将另一个数据帧附加到一个在该列上有完整索引的存储时会发生什么?它会自动继续吗?还是需要在最后一个文件上进行存储。创建表索引?当我的存储增长到80 Gig时,它会发生在磁盘上,因此不会产生内存问题?我想当附加它将索引到新方案。您实际需要排序的唯一原因是强制它重新索引(您实际上也可以通过pytables函数调用来执行此操作,这就是sortby所做的)ptdump输出中的
pandas\u版本:=b'0.10.1'
有什么问题?我添加了您最有可能用来创建test\u sorted.h5的缺少的ptrepack。请检查它是否正确。上次更改版本(pandas用于重建数据的表元数据的实际结构)是什么时候。因此,有一段时间没有改变(有一段时间是0.10.0)。如果需要更改结构,允许向后兼容读取。@K“存储区显示仍然显示索引器和数据列(这可能是我对pytables机器一无所知)”…-如果我理解正确的话,使用术语“索引”会引起混淆,而对于熊猫来说,这是行/列的索引器,在pyTables中,这是查询的索引(因此在pyTables端没有进行索引,而列是索引器,正如您使用
data\u columns=…
)。我个人还不确定是否需要自动生成名为“索引”的“列”。据我所知,这会枚举行,但我相信这已经内置在Pytables中了。非常有趣的东西,谢谢。为了公平对待压缩算法,请记住您使用的是随机数据(很难压缩)。使用“真实”数据,您可能会得到更小的文件
ptrepack --chunkshape=auto --sortby=B test.h5 test_sorted.h5