我有一个7.4 got的csv文件。将其转换为带有python脚本的sqlite数据库后,输出DB为4.7Gb,约为原始大小的60%。
csv大约有150,000,000行。它有标题:
tkey,ipaddr,healthtime,numconnections,policystatus,activityflag每一行看起来都像是
261846,172.10.28.15,2012-02-03 16:15:00,22,1,1该脚本使用健康时间将数据拆分为表192个表。
当我第一次看到这些数字时,我以为我在某个地方出错了。如果只编写健康时间192次,而不是150,000,000次,那么文件大小的减少应该有多大呢?
编辑:,我一发布这篇文章,就意识到了答案。我正在删除大约40%的字符串,因此40%的尺寸减少。
编辑2让我们计算纯文本之间的大小差异:
"261846,172.10.28.15,2012-02-03 16:15:00,22,1,1" 和数据库条目:
db(261846,'172.10.28.15',22,1,1)首先,在纯文本表示中,我们从46个字符降至26个字符。
其余字符如下:
"261846,172.10.28.15,22,1,1"或者26个字节。如果每个整数需要存储在32位(4字节)中,那么我们有:
12字节(ipaddr) +4字节*4(整数字段)= 28字节。
因此,看起来转换为整数会使存储效率略低一些,而且我的所有收益都来自于减少每行中存储的字符数。
发布于 2012-05-30 21:18:07
SQLite没有运行压缩算法,但它将将数据存储在二进制文件中,而不是文本文件中。这意味着可以更有效地存储数据,例如使用32位(4字节)的数字来表示10,000,000,而不是将其存储为8字节的文本(如果文件是unicode的话)。
如果您有兴趣的话,这里有关于SQL数据库文件格式的更多细节。
这有意义吗?
发布于 2013-12-04 01:40:56
默认情况下,SQLite不压缩它写入磁盘的数据;但是,SQLite确实有一组“专有扩展”用于该目的和其他目的。在链接中查找ZIPVFS,如下所示。
http://www.sqlite.org/support.html和http://www.hwaci.com/sw/sqlite/prosupport.html
通过将字段编码为整数,可以在数据中实现许多“压缩”。例如,一个IP地址被设计成一个字(4个字节)。地址的每个octect可以用一个字的一个字节表示。
string[] octets = '172.168.0.1'.split('.')
int ip = atoi(octets[0]) << 24
ip |= atoi(octets[1]) << 16
ip |= atoi(octets[2]) << 8
ip |= atoi(octets[3])此外,您的时间戳可以用Unix时间表示,这是自时代以来的秒数。
UPDATE mytable SET healthtime = CAST(strftime('%s',healthtime) AS INTEGER);参见日期和时间函数。
请注意上面SQL中的CAST指令: SQLite不强制在列上输入,因此您可能会将一组数字存储为字符串;超出必要时增加字段大小(这也会使某些查询行为怪异)。
还有一件事:场的大小并不是故事的唯一部分。请记住,索引也占用空间,整数索引在磁盘大小和性能方面更有效。
发布于 2020-01-28 11:26:33
我的GIT存储库中有一个相当大的SQLite文件,我想知道为什么我的总存储库大小没有增长那么大,而是比我的SQLite-.db-file还要小。结果,默认情况下,GIT压缩存储库。对我的.db-file的快速检查也表明了这一点,因为压缩.db-file会产生一个压缩存档,其大小仅为.db-file的20%。
因此,至少在默认设置下,SQLite看起来并不是以压缩的方式存储数据。但是,尽管如此,将一个大的SQLite文件添加到GIT存储库可能还不错,因为GIT会自动执行压缩。
https://stackoverflow.com/questions/10824347
复制相似问题