Вставка миллиардов данных в Sqlite через Python - PullRequest
0 голосов
/ 28 января 2019

Я хочу вставить миллиарды значений (обменных курсов) в файл sqlite db.Я хочу использовать многопоточность, потому что это занимает много времени, но цикл пула потоков выполняет один и тот же n-й элемент несколько раз.У меня есть инструкция print в начале моего метода, и она печатается несколько раз вместо одного.

pool = ThreadPoolExecutor(max_workers=2500)

def gen_nums(i, cur):
    global x
    print('row number', x, ' has started')
    gen_numbers = list(mydata)
    sql_data = []
    for f in gen_numbers:
        sql_data.append((f, i, mydata[i]))
    cur.executemany('INSERT INTO numbers (rate, min, max) VALUES (?, ?, ?)', sql_data)
    print('row number', x, ' has finished')
    x += 1


with conn:
    cur = conn.cursor()
    for i in mydata:
        pool.submit(gen_nums, i, cur)

pool.shutdown(wait=True)

и вывод:

row number 1  has started
row number 1  has started
row number 1  has started
row number 1  has started
row number 1  has started
row number 1  has started
row number 1  has started
...

1 Ответ

0 голосов
/ 28 января 2019

Делите ваши данные на куски на лету, используя выражения генератора, вставляйте их внутри транзакции.

Здесь как может выглядеть ваш код.

Кроме того, sqliteимеет возможность импортировать CSV-файлы.

Sqlite может выполнять десятки тысяч вставок в секунду , просто убедитесь, что все они выполняются в одной транзакции:окружая вставки BEGIN и COMMIT.(executemany () делает это автоматически.)

Как всегда, не оптимизируйте, пока не поймете, что скорость будет проблемой.Сначала протестируйте самое простое решение и оптимизируйте его, только если скорость неприемлема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...