簡體   English   中英

空間優化具有許多重復項的大型陣列

[英]space optimize a large array with many duplicates

我有一個數組,其中索引兼作“一組項目的標識符”,並且數組的內容是組號。 組號在0..N的有限范圍內,其中N << length_of_the_array。 因此,每個條目將被重復很多次。 當前,我必須使用2個字節來表示組號(可以是> 1000但<6500),由於重復的性質,它最終會占用大量內存。

由於整個陣列可以進入多個MB,因此有空間優化該陣列的方法。 感謝任何指向相關優化算法/技術的指標。 僅供參考:im正在使用的編程語言是cpp。

您是否仍然希望對任意元素進行有效的隨機訪問? 還是在考慮index->​​ group map的節省空間的序列化?

如果您仍然想要高效的隨機訪問,則單個陣列查找也不錯。 最糟糕的是單個緩存未命中。 好吧,真的,最糟糕的是頁面錯誤,或者更可能是TLB丟失,但是如果只有幾MB,則不太可能。

可以對經過排序和游程長度編碼的列表進行二進制搜索(通過搜索重復計數的前綴和數組),但這僅在您偶爾可以對列表進行排序以使重復項保持在一起的情況下才有效。

如果不能將重復項至少某種程度地組合在一起,那么您將無濟於事,無法進行隨機訪問。

打包的12位條目可能不值得麻煩,除非這樣做足以顯着減少緩存未命中。 與高速緩存未命中相比,一對用於生成正確地址的乘法指令以及包含所需值的16b負載上的移位和掩碼指令沒有太多開銷。 對打包位域的寫訪問速度較慢,並且不是原子操作,因此這是一個嚴重的缺點。 使編譯器使用結構打包位域可能是特定於編譯器的。 也許只使用char數組是最好的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM