问题

我想将数十亿的值(汇率)插入sqlite db文件。我想使用线程,因为它需要很多时间,但是线程池循环会多次执行相同的第n个元素。我在方法的开头有一条打印语句,它打印多次而不是一次。

 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可以导入CSV文件。

Sqlite每秒可以完成数以万计的插入,只需通过用BEGIN和COMMIT包围插入即可确保在单个事务中完成所有插入。 (executemany()自动执行此操作。)

与往常一样,不要在知道速度会成问题之前就进行优化。首先测试最简单的解决方案,并且仅在速度不可接受时才进行优化。

  相同标签的其他问题

pythonsqlite