Так что спустя годы у меня все еще остается тот же вопрос, но с помощью индексации и запросов эта проблема является лишь незначительной, в зависимости от размера вашей таблицы. С использованием readWhere или getListWhere я думаю, что проблема составляет примерно O (n)
Вот что я сделал ...
1. Я создал таблицу, в которой было два индикатора. Вы можете использовать несколько индикаторов в PyTables:
http://pytables.github.com/usersguide/optimization.html#indexed-searches
Когда ваша таблица проиндексирована , я также использую LZO-сжатие, вы можете сделать следующее:
import tables
h5f = tables.openFile('filename.h5')
tbl = h5f.getNode('/data','data_table') # assumes group data and table data_table
counter += 0
for row in tbl:
ts = row['date'] # timestamp (ts) or date
uid = row['userID']
query = '(date == %d) & (userID == "%s")' % (ts, uid)
result = tbl.readWhere(query)
if len(result) > 1:
# Do something here
pass
counter += 1
if counter % 1000 == 0: print '%d rows processed'
Теперь код, который я здесь написал, на самом деле довольно медленный. Я уверен, что есть некоторые гуру PyTables, которые могли бы дать вам лучший ответ. Но вот мои мысли о производительности:
Если вы знаете, что начинаете с чистых данных, т. Е. (Без дубликатов), то все, что вам нужно сделать, это один раз запросить у таблицы ключи, которые вы хотите найти, что означает, что вам нужно только сделать:
ts = row['date'] # timestamp (ts) or date
uid = row['userID']
query = '(date == %d) & (userID == "%s")' % (ts, uid)
result = tbl.getListWhere(query)
if len(result) == 0:
# key pair is not in table
# do what you were going to do
pass
elif len(result) > 1:
# Do something here, like get a handle to the row and update instead of append.
pass
Если у вас достаточно времени, чтобы проверить наличие дубликатов, создайте фоновый процесс, который просматривает каталог с вашими файлами и ищет дубликаты.
Я надеюсь, что это поможет кому-то еще.