Я сейчас немного играю с SQLAlchemy, что на самом деле довольно аккуратно.SQLAlchemy: Сканировать огромные таблицы с помощью ORM?
Для тестирования я создал огромную таблицу, содержащую мой архив фотографий, индексированный хэшами SHA1 (для удаления дубликатов :-)). Который был impressingly быстро ...
Для удовольствия я сделал эквивалент select *
над полученной SQLite базой данных:
session = Session()
for p in session.query(Picture):
print(p)
Я ожидал увидеть хэш прокрутки, но вместо этого он просто продолжал сканирование диска. В то же время использование памяти резко увеличилось, достигнув 1 ГБ через несколько секунд. Это, похоже, исходит из функции идентификационной карты SQLAlchemy, которая, как я думала, только сохраняла слабые ссылки.
Может кто-нибудь объяснить это мне? Я думал, что каждый Picture p будет собран после того, как будет выписан хэш !?
Заметил эту же проблему сам. Если я делаю 'len (Session.query (Model) .limit (100) .all())', я получаю '1'. Если я удалю «limit», используйте skyrockets для использования памяти. –