2014-07-04 31 views
4

我制作了我的Django模型,并在向我的PostgreSQL数据库插入测试/虚拟记录后,我意识到我的数据对于每条记录来说都相当大。所有领域的数据总和大约为每个记录700 KB。我估计我将有大约500万条记录,所以这将在3350 GB标记周围变得非常大。我的大部分数据都是大的JSON转储(每个字段大约70+ KB)。Django:数据库级别或代码级别的TextField(字符串)数据压缩

我不确定PostgreSQL是否会在通过Django框架处理时自动压缩我的数据。我想知道在将数据输入数据库之前是否应该压缩数据。

问题:使用Django模型字段类型TextField在使用一些x压缩算法 PostgreSQL可以自动压缩我的字符串字段?

我不应该依赖PostgreSQL,只是事先压缩我的数据,然后将它输入到数据库?如果是这样,我应该使用哪个压缩库?我已经在Python中尝试过zlib,看起来不错,但是,我读过gzip这个库,我很困惑这将是最有效的(就压缩和解压缩速度以及压缩百分比而言)。

编辑:我读了this Django snippet for CompressedTextField这引发了我对使用哪个压缩库的困惑。我看到一些人使用zlib,而一些人使用gzip

编辑2:This stackoverflow question表示PostgreSQL自动压缩字符串数据。

编辑3:PostgreSQL使用pg_lzcompress.c进行压缩,这是LZ压缩系列的一部分。假设我们不需要在TextField本身上使用某种其他形式的压缩(zlibgzip),因为它在数据库本身中的数据类型为text(可变长度字符串)?

回答

2

是的,postgresql将压缩大型文本字段,完全独立于您正在使用的任何框架。

使用名为TOAST的东西存储大字段值。这些属性可能会被压缩,如果太大而无法在列中嵌入,它们会被存储在称为TOAST表的特殊文件中。

正如您已经确定使用了LZ压缩。这不会像其他一些算法那样具有很高的压缩比。但是,为了获得收益,您可能会怀疑,如果磁盘空间是您的主要担忧,那么在将应用程序中的数据发送到数据库之前压缩数据是值得的。

您可以通过设置列的存储模式来影响属性的存储。请参阅手册页上的SET STORAGE以了解ALTER TABLE

PLAIN必须用于固定长度值(如整数),并且是内联,未压缩的 。 MAIN用于内联可压缩数据。 EXTERNAL 用于外部未压缩数据,EXTENDED用于外部, 压缩数据。 EXTENDED是 支持非PLAIN存储的大多数数据类型的默认值。

TEXT的默认值是EXTENDED。

但是,您应该考虑一下如何使用您的数据。将使用什么类型的查询来访问数据?将使用哪些过滤标准?它必须通读所有这些大TOAST属性才能访问WHERE子句中使用的值,那么性能可能会很差。

+0

你好@harmic,我首先想非常感谢你。你的回答非常有帮助:)。我不会读通过大的TOAST属性。我将通过主键进行筛选,并将其名称编入索引。 TOAST数据将由WHERE主键获取= 。几乎所有的数据过滤都将通过PK完成。我不会通过阅读TOAST属性来访问数据。 – user1757703