Я задал еще один вопрос: https://stackoverflow.com/questions/1180240/best-way-to-sort-1m-records-in-python, где я пытался определить лучший подход для сортировки 1 миллиона записей. В моем случае мне нужно иметь возможность добавлять дополнительные элементы в коллекцию и использовать их. Мне предложили попробовать использовать для этой задачи BTree от Zope. После некоторого чтения я немного озадачен тем, какие данные я бы поместил в набор.
По сути, для каждой записи у меня есть две части данных. 1. Уникальный идентификатор, который соответствует пользователю, и 2. интересующее значение для сортировки.
Я вижу, что я могу добавить элементы в OOSet как кортежи, где значение для сортировки находится в индексе 0. Таким образом, (200, 'id1'),(120, 'id2'),(400, 'id3')
и результирующий набор будут отсортированы с id2, id1 and id3
по порядку.
Однако частью требования для этого является то, что каждый идентификатор появляется в наборе только один раз. Я буду периодически добавлять дополнительные данные в набор, и новые данные могут включать или не включать дублированные «идентификаторы». Если они дублируются, я хочу обновить значение, а не добавлять дополнительную запись. Итак, основываясь на приведенных выше кортежах, я мог бы добавить (405, 'id1'),(10, 'id4')
в набор и хотел бы, чтобы на выходе было id4, id2, id3, id1
по порядку.
Любые предложения о том, как это сделать. Извините за мою новизну в этом вопросе.
* ИЗМЕНИТЬ – дополнительная информация *
Вот реальный код из проекта:
for field in lb_fields:
t = time.time()
self.data[field] = [ (v[field], k) for k, v in self.foreign_keys.iteritems() ]
self.data[field].sort(reverse=True)
print "Added %s: %03.5f seconds" %(field, (time.time() - t))
Foreign_keys — это исходные данные в словаре с каждым идентификатором в качестве ключа и словарем дополнительных данных в качестве значения. data — это словарь, содержащий списки отсортированных данных.
В качестве примечания: по мере выполнения каждой итерации поля for в lb_fields время сортировки увеличивается - ненамного... но заметно. После того, как 1 миллион записей был отсортирован для каждого из 16 полей, он использует около 4 гигабайт или ОЗУ. В конце концов это будет работать на машине с 48 гигабайтами.