connection.commit()性能影响

时间:2015-02-09 00:33:57

标签: python sqlite

当将大型日志文件解析为sqlite数据库时,如果我们在每次插入后不调用connection.commit()或者没有任何区别,那么是否有任何重大性能提升。我想问题是,它是否仅用于分离交易或是否需要时间。

1 个答案:

答案 0 :(得分:3)

是的,性能随着更频繁的提交而直接降低。

这是一个使用" lorem ipsum"大约1400行的文本文件:

import argparse
import sqlite3
import textwrap
import time

parser = argparse.ArgumentParser()
parser.add_argument("n", help="num lines per commit", type=int)
arg = parser.parse_args()

con = sqlite3.connect('lorem.db')
cur = con.cursor()
cur.execute('drop table if exists Lorem')
cur.execute('create table Lorem (lorem STRING)')
con.commit()

with open('lorem.txt') as f: lorem=textwrap.wrap(f.read())
print('{} lines'.format(len(lorem)))

start = time.time()
for i, line in enumerate(lorem):
    cur.execute('INSERT INTO Lorem(lorem) VALUES(?)', (line,))
    if i % arg.n == 0: con.commit()
stend = time.time()

print('{} lines/commit: {:.2f}'.format(arg.n, stend-start))

将其保存为sq.py ...:

$ for i in `seq 1 10`; do python sq.py $i; done
1413 lines
1 lines/commit: 1.01
1413 lines
2 lines/commit: 0.53
1413 lines
3 lines/commit: 0.35
1413 lines
4 lines/commit: 0.27
1413 lines
5 lines/commit: 0.21
1413 lines
6 lines/commit: 0.19
1413 lines
7 lines/commit: 0.17
1413 lines
8 lines/commit: 0.14
1413 lines
9 lines/commit: 0.13
1413 lines
10 lines/commit: 0.11

因此,将commit减半的操作时间减半,等等 - 它不是线性但几乎是如此。

为了完整性:每次提交100行将运行时间减少到0.02。

重复这一点,你可以轻松地试验和测量时间,使数据库表更接近实际需要。