我想创建一个包含5,000,000个tinyint值(0到256之间)的SQLITE文件。 根据我的计算,这个文件大概应该使用5 [MB]。
然而,我得到的文件大小接近50 [MB]。
这是我使用的代码:
import sqlite3
# Create and populate a database
db = sqlite3.connect('/home/mine/temp.db')
db.execute("CREATE TABLE IF NOT EXISTS test(id INT2)")
for i in range(0, 5000000):
db.execute("INSERT INTO test(id) VALUES({0})".format(0))
db.commit()
db.close()
任何想法如何优化事物以便占用更少的空间?
答案 0 :(得分:6)
对于数据库来说,还有更多的内容,而不仅仅是500万个小额的空间。 SQLite已发布details of their file format。似乎说你每行至少需要9个字节。
SQLite使用两种不同的变体 B树结构:
- 表B-Tree,使用64位 键的整数值。在一张桌子里 B-Tree,一个相关的数据库记录 (第2.3.2节)与...一起存储 每个条目。表B树结构 在章节中详细描述 2.3.4。
- 索引B-Tree,它使用数据库记录作为键。索引B树 结构详细描述于 第2.3.3节。
答案 1 :(得分:2)
您是否考虑使用双列值/频率表?它会使查询变得更复杂(例如,您需要SUM(Value * Freq) / SUM(Freq)
而不是AVG(Value)
),但您最多只需要256行而不是500行。