2014-07-04 33 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