2011-03-27 39 views
2

我想创建一个包含5,000,000个tinyint值(0 - 256之间)的SQLITE文件。 根据我的计算,这个文件应该使用大约5 [MB]。SQLITE - 具有5,000,000个TINYINT值的文件?

但是,我得到的文件大小接近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

这取决于有多少表/索引/很多东西。你有没有试过创建一个数据库? – PostMan 2011-03-27 23:56:37

+0

我有,并得到一个巨大的文件。也许我不熟练使用SQLITE。有什么建议么? (我只需要一张桌子;根本没有指数) – user3262424 2011-03-27 23:57:48

+1

有多巨大? 6MB? 50MB?可能值得发布您用来生成表格的代码。然后人们可以就如何优化它提出具体的建议。 – 2011-03-28 00:11:34

回答

6

数据库还有很多,而不仅仅是500万小小的整数空间。 SQLite发布了details of their file format。似乎你会说每行至少需要9个字节。

SQLite的使用的 B树结构的两个不同的变体:

  • 表B树,它使用64位 整数值键。在B-Tree表 中,关联的数据库记录 (第2.3.2节)与 一起存储在每个条目中。表B-Tree结构 在部分 中详细描述2.3.4。
  • 索引B-Tree,它使用数据库记录作为键。索引B-Tree 结构在 第2.3.3节中详细描述。
+0

谢谢,这解释了一切。 – user3262424 2011-03-28 01:45:59

2

您是否考虑过使用两列值/频率表?它会使查询更复杂一些(例如,您需要SUM(Value * Freq)/SUM(Freq)而不是AVG(Value)),但您只需要最多256行而不是500万行。

+0

我不明白这是如何解决这个问题/这是如何节省5百万行。你可以解释吗? – user3262424 2011-06-10 03:42:59

+0

例如,如果您有4200次出现20000次,则不存储20000行(42)。你存储一行(42,20000)。 – dan04 2011-06-10 04:37:36

+0

我明白了。事实是,我确实需要知道哪个“ID”结果在哪个数字中。所以这种类型的压缩不适合我。 – user3262424 2011-06-10 22:20:59