SQLITE - 具有5,000,000个TINYINT值的文件?

时间:2011-03-27 23:54:15

标签: sqlite

我想创建一个包含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()

任何想法如何优化事物以便占用更少的空间?

2 个答案:

答案 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行。