Ввод большого количества записей в базе данных SQLite - PullRequest
3 голосов
/ 22 декабря 2011

Я использую следующий код python3 для добавления и обновления записей в базе данных sqlite3:

def increment_person_counts(count_per_person):
   with sqlite3.connect(r'./people_database') as connection:
      cursor = connection.cursor()
      for person in count_per_person:
         if cursor.execute('select * from personCounts where person = ?', [person]).fetchone()==None:
            cursor.execute('insert into personCounts(person, count) values (?, ?)', [person, count_per_person[person]])
         else:
            cursor.execute('update personCounts SET count=count + ? WHERE person=?', [count_per_person[person], person])
      connection.commit()

count_per_person содержит 4 миллиона записей, и мне кажется, что я могу добавлять / обновлять около 100 записей в секунду, чтоозначает, что добавление этих значений займет полдня.Есть ли лучший / быстрый подход к этому, который я должен рассмотреть?

Спасибо за вашу помощь,

Барри

1 Ответ

2 голосов
/ 22 декабря 2011

Вы можете прочитать все свои 'select * from personCounts' в питоне set() в начале, а затем проверить только по этому набору.

def increment_person_counts(count_per_person):
   with sqlite3.connect(r'./people_database') as connection:
      cursor = connection.cursor()
      cursor.execute('select person from personCounts')
      known_persons = set(row[0] for row in cursor.fetchall())
      for person, count in count_per_person.iteritems():
         if person in known_persons:
            cursor.execute('insert into personCounts(person, count) values (?, ?)', [person, count])
         else:
            cursor.execute('update personCounts SET count=count + ? WHERE person=?', [count, person])
      connection.commit()

ОБНОВЛЕНИЕ : после моего комментария, вот обновление с executemany:

def increment_person_counts(count_per_person):
    with sqlite3.connect(r'./people_database') as connection:
        cursor = connection.cursor()
        cursor.execute('select person from personCounts')
        known_persons = set(row[0] for row in cursor.fetchall())
        cursor.executemany('insert into personCounts(person, count) values (?, ?)', ((person, count) for count_per_person.iteritems() if person in known_persons))
        for person, count in count_per_person.iteritems():
            if person not in known_persons:
                cursor.execute('update personCounts SET count=count + ? WHERE person=?', [count, person])
        connection.commit()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...