通过Python向Sqlite插入数十亿数据

通过Python向Sqlite插入数十亿数据,python,sqlite,Python,Sqlite,我想在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)

我想在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
...

使用生成器表达式动态地将数据划分为块,在事务中插入数据

您的代码可能是什么样子的

此外,sqlite还能够

Sqlite可以执行数十个操作,只需确保在一个事务中使用BEGIN和COMMIT围绕插入来完成所有操作。(executemany()会自动执行此操作。)


和往常一样,在你知道速度会成为一个问题之前,不要进行优化。首先测试最简单的解决方案,只有在速度不可接受时才进行优化。

使用线程没有意义;一次只能插入一行,这样可以有效地实现串行。