2015-03-21 3 views
1

У меня есть следующие данные в моей базе данных (пример):Как извлечь данные из SQLite быстрее питона

longitude (real): 70.74 
userid (int): 12 

Это, как я принесу:

import sqlite3 as lite 
con = lite.connect(dbpath) 
    with con: 
    cur = con.cursor() 
    cur.execute('SELECT latitude, userid FROM message') 
    con.commit() 
    print "executed" 
    while True: 
     tmp = cur.fetchone() 
     if tmp != None: 
      info.append([tmp[0],tmp[1]]) 
     else: 
      break 

Чтобы получить ту же информацию на форме [70.74, 12] Что еще я могу сделать, чтобы ускорить этот процесс? На 10 000 000 строк это занимает около 50 секунд, так как я нацелен на 200 000 000 строк - я никогда не преодолеваю этого, возможно, утечку памяти или что-то в этом роде?

+1

Если 'userid' уже является' int', зачем создавать новый 'int'? –

+0

Извините, я был некорректен, я фактически сохранил userid в качестве текста, чтобы сохранить любые начальные нули. – bjornasm

+0

Какова ваша мера? Как быстро это выполняется и какие улучшения вы надеетесь? –

ответ

1

Из документации sqlite3:

экземпляр подряд служит оптимизированный row_factory для объектов подключения. Он пытается имитировать кортеж в большинстве своих функций.

Поскольку тесно имитирует кортеж, в зависимости от ваших потребностей вам даже не нужно распаковывать результаты.

Однако, поскольку ваши числовые типы хранятся в виде строк, нам нужно выполнить некоторую обработку. Как отметил @Jon Clements, курсор является итерируемым, поэтому мы можем просто использовать понимание, получая одновременно float и int.

import sqlite3 as lite 

with lite.connect(dbpath) as conn: 
    cur = conn.execute('SELECT latitude, userid FROM message') 

    items = [[float(x[0]), int(x[1])] for x in cur] 

EDIT: Мы не делаем никаких изменений, так что нам не нужно вызывать commit.

+1

Вы можете отбросить '.fetchall', поскольку по умолчанию будет выгружать список кортежей ... он будет действовать как итеративный в противном случае, поэтому' for x in cur' в порядке. Можно даже отказаться от создания объекта курсора и выполнить на объекте соединения ... –

+0

Спасибо! Я добавлю эти предложения сейчас. –

Смежные вопросы