Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQLITE——一个有5000000个TINYINT值的文件?_Sqlite - Fatal编程技术网

SQLITE——一个有5000000个TINYINT值的文件?

SQLITE——一个有5000000个TINYINT值的文件?,sqlite,Sqlite,我想创建一个SQLITE文件,其中包含5000000个tinyint值(介于0-256之间)。 根据我的计算,这个文件应该使用大约5[MB] 然而,我得到的文件大小接近50[MB] 以下是我使用的代码: 导入sqlite3 #创建并填充数据库 db=sqlite3.connect('/home/mine/temp.db') execute(“如果不存在,则创建表测试(id INT2)”) 对于范围(0,5000000)内的i: execute(“插入测试(id)值({0})”.format(0)

我想创建一个SQLITE文件,其中包含5000000个tinyint值(介于0-256之间)。 根据我的计算,这个文件应该使用大约5[MB]

然而,我得到的文件大小接近50[MB]

以下是我使用的代码:

导入sqlite3 #创建并填充数据库 db=sqlite3.connect('/home/mine/temp.db') execute(“如果不存在,则创建表测试(id INT2)”) 对于范围(0,5000000)内的i: execute(“插入测试(id)值({0})”.format(0)) db.commit() db.close()
你知道如何优化东西,使它占用更少的空间吗?

一个数据库不仅仅是500万个小整数的空间。SQLite已经发布了。它似乎表示每行至少需要9个字节

SQLite使用两种不同的 B-树结构:

  • 表B-Tree,使用64位 键的整数值。在桌子上 B-树,关联的数据库记录 (第2.3.2节)与 每个条目。表B-树结构 在第节中详细描述了 2.3.4.
  • 索引B树,它使用数据库记录作为键。索引B-树 有关结构的详细信息,请参阅 第2.3.3节

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

这取决于有多少表/索引/很多东西。你试过创建数据库吗?我试过了,得到了一个大文件。也许我对SQLITE不太精通。有什么建议吗?(我只需要一个表,根本没有索引)有多大?6MB?50MB?可能值得发布用于生成表的代码。然后人们可以就如何优化它提出具体的建议。注意到您正在将值替换到SQL中。不要那样做。改为使用预先准备好的语句样式(对于整数,它会给你一个加速,对于字符串,或者任何来自外部世界的东西,它也会给你带来安全)。谢谢你,这就解释了一切。我不明白这是如何解决问题的/这是如何让我免于拥有500万行的。你能解释一下吗?例如,如果42这个数字出现了20000次,那么你没有存储(42)的20000行。你储存一排(4220000)。我明白了。事实是,我确实需要知道哪个
ID
导致哪个数字。所以这种类型的压缩对我来说不起作用。是的,这确实有很大的不同。可能希望通过将表示例更改为
(ID INTEGER主键,Value INTEGER)
来澄清您的问题。