我是Python和Sqlite的新手,所以我确信有更好的方法可以做到这一点。我有一个6000行的数据库,其中1列是14K XML字符串。我想压缩所有这些XML字符串以使数据库更小。不幸的是,下面的脚本比这个简单的命令行(需要几秒钟)慢得多。
sqlite3 weather.db .dump | gzip -c > backup.gz
我知道这不是一回事,但它会将数据库读取/转换为文本并运行gzip。所以我希望这个脚本在10倍的性能范围内,但它更像1000X慢。有没有办法使以下脚本更有效?的由于
import zlib, sqlite3
conn = sqlite3.connect(r"weather.db")
r = conn.cursor()
w = conn.cursor()
rows = r.execute("select date,location,xml_data from forecasts")
for row in rows:
data = zlib.compress(row[2])
w.execute("update forecasts set xml_data=? where date=? and location=?", (data, row[0], row[1]))
conn.commit()
conn.close()
答案 0 :(得分:2)
不确定您是否可以通过事后更新来提高性能。压缩和更新记录之间的开销太大。除非在完成更新后进行真空处理,否则不会节省任何空间。最好的解决方案可能是在首次插入记录时进行压缩。那么你就可以节省空间,性能也不会太明显。如果你不能在插页上做,那么我认为你已经探索了两种可能性并看到了结果。
答案 1 :(得分:2)
您在这里将苹果与橙子进行比较。 sqlite3 | gzip和python版本之间的最大区别在于后者将更改写回数据库!
sqlite3 | gzip的作用是:
除了上面的内容之外,python版本将gzip压缩文本写回数据库,每个读取记录只有一个UPDATE。
答案 2 :(得分:1)
很抱歉,您是否在代码中隐式启动了一项交易?如果你在每次UPDATE之后自动提交,那将大大减慢你的速度。
您是否在日期和/或地点拥有合适的索引?你在这些专栏中有什么样的变化?你能在这个表中使用自动编号的整数主键吗?
最后,您能了解一下您在zlib调用中花费了多少时间以及在UPDATE中花了多少时间?除了将减慢此过程的数据库写入之外,您的数据库版本还涉及7.5个调用(具有6000个初始化)的zip算法。