1
將大型日誌文件解析到sqlite數據庫時,如果我們在每次插入後不調用connection.commit()
或者沒有任何區別,那麼主要性能會有所提高。我想問題是如果它只是爲了分離交易或者是否需要時間做任何事情。connection.commit()對性能的影響
將大型日誌文件解析到sqlite數據庫時,如果我們在每次插入後不調用connection.commit()
或者沒有任何區別,那麼主要性能會有所提高。我想問題是如果它只是爲了分離交易或者是否需要時間做任何事情。connection.commit()對性能的影響
是的,性能會隨着更頻繁的提交而直接下降。
這裏有一個玩具例如約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。
對此,您可以輕鬆地嘗試和衡量時間,使用數據庫表更接近實際需要。
只要你願意,可以關閉「多個」問題中的一部分,因爲這個原因:'問題要求我們推薦或找到一本書,工具,軟件庫,教程或其他非現場資源',另一個問題一個與sqlite有關。 – noob 2015-02-09 01:16:37
@mash,我明白你的觀點,而且,奇怪的是,軟件recs堆棧交換站點似乎不希望Qs要求SW recs(?!)。在這種情況下,解決方案是在日誌分析任務樣本中圍繞特定性能測量值構造其他Q,並詢問如何加速這些任務 - 無論是通過微調還是不同地使用該庫,編碼Python直接使用其他庫,不管怎麼說,這都是一個SO問題,而不是要求書籍,工具,軟件庫,教程等等。 – 2015-02-09 01:20:12