У меня есть таблица с линиями около 1,7 м, общая сумма 1 ГБ, и вам нужно выполнить различные запросы. Будучи самым удобным с Python, мой первый подход заключался в том, чтобы взломать кучу словарей, которые были бы связаны с запросами, которые я пытался сделать. Например. если мне нужно было иметь доступ ко всем с определенным кодом и возрастом, я бы сделал двумерное dict-файл isacode_age. В итоге мне потребовалось немало таких, которые умножили объем памяти (порядка 10 ГБ), и хотя у меня было достаточно оперативной памяти для поддержки этого процесса, процесс все еще был довольно медленным.Запрос (довольно) больших реляционных данных на Python за разумное количество времени?
На данный момент мне показалось, что я играю в игру присоски. «Ну, это то, для чего были созданы реляционные базы данных, верно?», Подумал я. Я импортировал sqlite3 и импортировал свои данные в базу данных в памяти. Я считаю, что базы данных построены для скорости, и это решит мои проблемы.
Получается, что выполнение запроса типа «SELECT (a, b, c) FROM foo WHERE date1 < = d AND date2> e AND name = f" занимает 0.05 секунд. Выполнение этого для моих 1,7 м строк займет 24 часа времени вычисления. Мой взломанный подход со словарями был примерно на 3 порядка быстрее для этой конкретной задачи (и в этом примере я не мог указать дату1 и дату2, поэтому я получал каждую строку, совпадающую с именем, а затем фильтрацию по дате).
Итак, мой вопрос: почему это так медленно и как я могу сделать это быстро? И что такое питонический подход? Возможности Я рассматривал:
- sqlite3 слишком медленно, и мне нужно что-то более тяжелом
- мне нужно каким-то образом изменить мою схему или мои запросы, чтобы быть более ... оптимизированы?
- Подходы, которые я пробовал до сих пор, совершенно неправильны, и мне нужен совершенно новый инструмент.
- Я где-то читал, что в sqlite 3 повторные вызовы cursor.execute намного медленнее, чем использование курсора. executemany. Оказывается, что executemany даже не совместим с select statement, хотя, поэтому я думаю, что это была красная селедка.
Спасибо.
Вы говорите, что вам нужно запросить его 1,7 миллиона раз, потому что есть 1,7 миллиона строк? – gahooa
Если вы делаете только простые числовые запросы и не нуждаетесь в соединениях и т. Д., Посмотрите на 'pytables' http://www.pytables.org/moin –