存儲大量32位整數值(按升序排列),僅用於連續讀取。原始文件很大,不能放入RAM中,逐塊讀取。到目前爲止,我只是將它們保存爲二進制文件,每個值4個字節。如何在二進制文件中存儲有序整數集?
隨着系統的不斷髮展,需要優化存儲/備份空間,我發現考慮到它的排序,對這些數據進行高效壓縮具有很大的潛力。
我想出的是存儲初始值,然後是增量,隨着集合中值的數量增加,增量往往更小。將它們的大小舍入到全字節,我建議每個增量只留下有意義的字節,所以不是4,而是每增加1-2-3字節。爲了表示使用的字節數,我會使用標題每個增量2位。
流看起來像:
01010101 01010101 01010101 01010101 - initial value
Four increments block start
10110101 - b bytes used: four 2-bit pairs
(10 11 01 01 = 2, 3, 1, 1)
01010101 01010101 - inc
01010101 01010101 01010101 - inc
01010101 - inc
01010101 - inc
Four increments block start
11011101 - b (11 01 11 01 = 3, 1, 3, 1)
01010101 01010101 01010101 - inc
01010101 - inc
01010101 01010101 01010101 - inc
01010101 - inc
...
我是不是想在這裏發明車輪?在這裏流式壓縮可以更有效率,在相當小的塊上保持運行嗎?
所以你想用PHP壓縮數據?什麼樣的數據?如果您試圖將文件轉換爲二進制文件並保存。這將不會有效 – codinginsane 2014-12-07 10:08:24
您的文件有多大?可能使用支持壓縮的基於數據庫的解決方案是一種方法嗎?這樣你就可以獲得所有功能,而不用重新創建任何車輪 – Konstantin 2014-12-07 10:15:16
@CodingInsane,如問題中所述:數據是32位整數的有序集合。從某些服務中收到,以二進制格式保存到本地文件中。 「這根本不會有效」 - 爲什麼? – Serge 2014-12-07 10:17:03