2016-10-24 1 views
1

Je cherche un moyen de récupérer des enregistrements triés à partir d'une table hdf. Voici un MWE python:Comment récupérer des enregistrements triés à partir d'une table hdf

import tables 
import numpy as np 

class Measurement(tables.IsDescription): 
    time = tables.Float64Col() 
    value = tables.Float64Col() 

h5 = tables.open_file('test.hdf', 'w') 
h5.create_table('/', 'test', Measurement) 

table = h5.root.test 
data = np.array([(0, 6), (5, 1), (1, 8)], dtype=[('time', '<f8'), ('value', '<f8')]) 
table.append(data) 
table.cols.time.createCSIndex() 

J'aimerais maintenant récupérer tous les dossiers avec time > 0, triées par time. Si je fais:

table.read_where('time > 0') 

il obtient:

array([(5.0, 1.0), (1.0, 8.0)], dtype=[('time', '<f8'), ('value', '<f8')]) 

qui ne sont pas triées par time. Si j'essaye d'employer read_sorted alors j'obtiens la table entière au lieu d'un sous-ensemble (il n'y a aucun argument de condition à read_sorted).

Quelle est la pratique courante? Devrais-je m'assurer que mes tables sont stockées triées dans la base de données? Ou devrais-je trier moi-même l'ensemble récupéré après read_where?

Répondre

0

Je ne pense pas qu'il existe une solution unique à votre question.

Si vous êtes dans une situation où vous écrivez une seule fois dans le fichier et que vous devez le lire plusieurs fois, il serait certainement judicieux de stocker les tables de manière triée. Pour les fichiers déjà existants, vous pouvez utiliser l'utilitaire ptrepack qui peut copier les données existantes de manière triée.

Si vous ne lisez que quelques fois les données, le stockage trié peut ne pas être le moyen le plus efficace. Juste read_where pour obtenir vos données en mémoire et trier ensuite.

Si vos données sont trop volumineuses pour tenir dans la mémoire, vous devrez les stocker de manière triée.

Et il y a plus de possibilités, en fonction de la performance de votre système (SSD, disque dur, stockage réseau, CPU, ...)