Pandas read_sql с sqlite очень замедляет выполнение простых запросов, ожидается ли это?

#python #pandas #sqlite

#python #pandas #sqlite

Вопрос:

Я создал 24 большие базы данных sqlite, чтобы помочь обрабатывать большой объем данных, который слишком велик для управления непосредственно в фрейме данных pandas из-за ограничений памяти. Каждая база данных содержит около 4 миллионов строк, 229 столбцов с диапазоном строковых, целых и плавающих точек данных. При сохранении на жестком диске они составляют 2,2 ГБ.

Теперь, попытавшись использовать новые базы данных, я нахожу запросы очень медленными. Выполнение этого запроса для простого подсчета строк в данных занимает 50 секунд:

df = pd.read_sql('SELECT COUNT(ID) FROM MY_TABLE', engine)

Движок создан с помощью sqlalchemy,

engine = sqlalchemy.create_engine('sqlite:///my_path/my_db.db')

Я также пробовал sqlite3.connection() с аналогичными результатами.

Во время выполнения процесс едва использует от 6% до 7% процессора на пике, и объем оперативной памяти не увеличивается.

Следует ли ожидать такой производительности или может возникнуть проблема с созданными мной базами данных? Есть ли что-нибудь еще, что я могу рассмотреть, чтобы ускорить эту обработку?

Заранее спасибо за любую помощь

Комментарии:

1. Вероятно, проверьте, сколько времени требуется для запуска одного и того же кода без взаимодействия с pandas. Затем вы можете копать дальше, чтобы узнать, связаны ли с этим проблемы с подключением.

2. В стороне, df = pd.read_sql('SELECT COUNT(ID) FROM MY_TABLE', engine) выглядит грубо. Я бы не стал использовать pandas в качестве прокси для выполнения SQL, если мне это действительно не нужно. Что касается вопроса, я думаю, что это высоко. Есть причины postgres, по которым подсчет строк идет медленно; Я пытаюсь понять, переводятся ли они в SQLite

3. Кажется, я не могу найти никаких хитростей для SQLite:/ Есть ли индекс по идентификатору?

4. Спасибо всем, добавление индекса в поле ID значительно улучшило COUNT работу оператора (c50 секунд до 3), но другие простые запросы, такие как a GROUP BY , даже с использованием только индексированных столбцов, по-прежнему занимают c150 секунд. Я также выполнял те же запросы без взаимодействия с pandas, но я не смог обнаружить никакой разницы в производительности, а использование процессора по-прежнему незначительно