ptrepack sortby necesita índice ‘completo’

Estoy intentando reproducir un archivo HDF que se creó con la interfaz pytables de pandas HDFStore. El índice principal del dataframe era el tiempo, pero hice algunas columnas más de data_columns para poder filtrar los datos en el disco a través de estos data_columns.

Ahora me gustaría ordenar el archivo HDF por una de esas columnas (debido a que la selección es demasiado lenta para mi gusto, archivo de 84 GB), usando ptrepack con la opción sortby así:

 ()[maye@luna4 .../nominal]$ ptrepack --chunkshape=auto --propindexes --complevel=9 --complib=blosc --sortby=clat C9.h5 C9_sorted.h5 

y me sale el mensaje de error:

() [maye @ luna4 … / nominal] $ Problemas al copiar desde ‘C9.h5: /’ a ‘C9_sorted.h5: /’ El error fue ->: el campo de clat debe tener asociado un índice ‘completo’ en tabla /df/table (Table(390557601,)) '' . El archivo de destino se parece a: C9_sorted.h5 (Archivo) ” Última modificación: ‘Vie 26 de julio 18:17:56 2013’ Árbol de objetos: / (RootGroup) ” / df (Grupo) ” / df / table ( Tabla (0,), barajar, blosc (9)) ”

Seguimiento (última llamada más reciente): archivo “/ usr / local / epd / bin / ptrepack”, línea 10, en sys.exit (main ()) Archivo “/usr/local/epd/lib/python2.7/site -packages / tables / scripts / ptrepack.py “, línea 480, en main upgradeflavors = upgradeflavors) Archivo” /usr/local/epd/lib/python2.7/site-packages/tables/scripts/ptrepack.py “, línea 225, en copyChildren raise RuntimeError (“Por favor verifique que los nombres de los nodos no sean” RuntimeError: Por favor verifique que los nombres de los nodos no estén duplicados en el destino, y si es así, agregue la bandera –overwrite-nodes si lo desea. En particular, pague Atención que rootUEP no te está engañando.

¿Esto significa que no puedo ordenar un archivo HDF por una columna de índice porque no son índices “completos”?

Aquí hay un ejemplo completo.

Crea el marco con un data_column. Restablecer el índice a un índice completo. Utilice ptrepack para ordenar por ello.

 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]:  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) 

Esta es otra forma de crear un índice completamente ordenado (en lugar de escribirlo de esta manera)

 In [23]: !ptrepack --sortby=B test.h5 test_sorted.h5 In [26]: !ptdump -avd test_sorted.h5 / (RootGroup) '' /._v_attrs (AttributeSet), 4 attributes: [CLASS := 'GROUP', PYTABLES_FORMAT_VERSION := '2.1', 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,) /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] (2, [-0.2429293157073629], -1.779366453624283) [1] (1, [0.0981650001268093], -0.9209780702446433) [2] (9, [0.35865804118145655], 0.29939126149826045) [3] (0, [1.10989047288066], 0.396613633081911) [4] (6, [1.20129355706986], 0.47930635538027244) [5] (4, [-0.1480724789512519], 0.5260130757651649) [6] (5, [1.2560020435792643], 0.5455842491255144) [7] (8, [-0.40070941088441786], 0.7622228032635253) [8] (7, [0.9973598999689721], 0.8602929579025727) [9] (3, [0.7305529521507728], 1.243565083939927) 

He probado varias de las opciones que Jeff menciona en nuestras conversaciones anteriores.

Por favor, eche un vistazo a este cuaderno, esperamos que le ayude a tomar decisiones relevantes para su almacenamiento de datos: http://nbviewer.ipython.org/810bd0720bb1732067ff La idea principal del cuaderno está aquí: https://gist.github.com / michaelaye / 810bd0720bb1732067ff

Mis principales conclusiones:

  • Usar index = False tiene varios efectos impresionantes: 1. Reduce el tamaño del archivo HDF resultante. 2. Crea el HDFFile mucho más rápido. 3. Aun así, ptdump y the storer (). Group.table print-out no muestra ningún índice, la pantalla de la tienda aún muestra indizadores y columnas de datos (Eso es probablemente un desconocimiento de la maquinaria pytables de mi lado).
  • La creación de un índice a través de store.create_table_index () no hace nada todavía a la velocidad de selección de datos a través de una de las columnas de datos.
  • Este índice TIENE que ser un índice ‘completo’, de modo que el último ptrepack con –sortby no salga. Pero NO tiene que ser un nivel de índice 9. El nivel predeterminado 6 está bien y no parece influir significativamente en la velocidad de selección de datos. Tal vez lo haría con muchas columnas?
  • El uso de –propindexes casi duplica el tiempo de repintado de puntos con una ligera mejora en la velocidad de selección de datos.
  • Usar compresión y –propindexs es solo un poco más lento que usar –propindex solo, mientras que el tamaño de los datos (al menos en este ejemplo) no disminuye dramáticamente.
  • La velocidad de selección de datos no parece ser muy diferente al usar compresión.
  • La aceleración para este ejemplo de 1 mio. las líneas de 2 columnas de datos aleatorios usando simplemente –sortby without –propindexes es aproximadamente el factor 5 después de clasificar para la columna de selección.

Para completar, el resumen ultracorto de comandos:

 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() 

Y en la concha:

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