#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, по которым подсчет строк идет медленно; Я пытаюсь понять, переводятся ли они в SQLite3. Кажется, я не могу найти никаких хитростей для SQLite:/ Есть ли индекс по идентификатору?
4. Спасибо всем, добавление индекса в поле ID значительно улучшило
COUNT
работу оператора (c50 секунд до 3), но другие простые запросы, такие как aGROUP BY
, даже с использованием только индексированных столбцов, по-прежнему занимают c150 секунд. Я также выполнял те же запросы без взаимодействия с pandas, но я не смог обнаружить никакой разницы в производительности, а использование процессора по-прежнему незначительно