2016-10-24 2 views
1

Я ищу способ получить отсортированные записи из таблицы hdf. Вот питон MWE:Как получить отсортированные записи из таблицы 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() 

Теперь я хотел бы получить все записи с time > 0, отсортированные по time. Если я:

table.read_where('time > 0') 

, то он получает:

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

, не отсортированных по time. Если я попытаюсь использовать read_sorted, тогда я получу всю таблицу вместо подмножества (аргумент условия отсутствует для read_sorted).

Какова обычная практика? Должен ли я гарантировать, что мои таблицы хранятся в базе данных? Или я должен отсортировать полученный набор после read_where?

ответ

0

Не думаю, что на ваш вопрос подходит один размер.

Если вы находитесь в ситуации, когда вы пишете один раз в файл и должны его читать много раз, было бы неплохо хранить таблицы отсортированным образом. Для уже существующих файлов вы можете использовать утилиту ptrepack, которая может копировать существующие данные отсортированным образом.

Если вы только читаете данные несколько раз, хранение в отсортированном виде может быть не самым эффективным способом. Просто read_where, чтобы получить данные в памяти и отсортировать их потом.

Если ваши данные имеют большой размер, чтобы вписаться в память, вам необходимо сохранить данные в порядке сортировки.

И больше возможностей, в зависимости от производительности вашей системы (SSD, HDD, сетевого хранения, CPU, ...)