2015-02-09 174 views
1

將大型日誌文件解析到sqlite數據庫時,如果我們在每次插入後不調用connection.commit()或者沒有任何區別,那麼主要性能會有所提高。我想問題是如果它只是爲了分離交易或者是否需要時間做任何事情。connection.commit()對性能的影響

回答

3

是的,性能會隨着更頻繁的提交而直接下降。

這裏有一個玩具例如約1400線 「Lorem存有」 文本文件的工作:

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。

對此,您可以輕鬆地嘗試和衡量時間,使用數據庫表更接近實際需要。

+0

只要你願意,可以關閉「多個」問題中的一部分,因爲這個原因:'問題要求我們推薦或找到一本書,工具,軟件庫,教程或其他非現場資源',另一個問題一個與sqlite有關。 – noob 2015-02-09 01:16:37

+1

@mash,我明白你的觀點,而且,奇怪的是,軟件recs堆棧交換站點似乎不希望Qs要求SW recs(?!)。在這種情況下,解決方案是在日誌分析任務樣本中圍繞特定性能測量值構造其他Q,並詢問如何加速這些任務 - 無論是通過微調還是不同地使用該庫,編碼Python直接使用其他庫,不管怎麼說,這都是一個SO問題,而不是要求書籍,工具,軟件庫,教程等等。 – 2015-02-09 01:20:12