簡體   English   中英

c ++什么是內存壓縮庫?

[英]c++ what in-memory compression library?

我已經搜索了內存中的壓縮,發現有很多庫不具備此功能。 zlib似乎被廣泛使用 - 但它似乎也很老了。 我在這里問是否有更新,更好的選擇。

我想在內存中壓縮的數據是大小為幾兆字節(2-16 MB)的內存池,每個塊包含兩個不同結構的數據以及一些指針數組。 在塊內部,結構和數組沒有特定的順序,當應用程序需要創建這樣的元素時,它們只是在另一個之后分配。

你會建議使用什么壓縮庫? 壓縮和解壓縮性能(兩者)比壓縮質量更重要。

另外 - 出於壓縮原因 - 為兩個不同的結構和數組分別使用單獨的池會更好嗎,這樣每個要壓縮的數據塊只包含一種數據?

這是我第一次打算使用內存壓縮,我知道我的問題可能過於籠統,無法給出一個好的答案 - 但每個提示都是受歡迎的!

謝謝!

zlib很好。 許多人都證明,表現和理解。 這就是我在新系統中默認使用的內容,就像你描述的那樣。 它的年齡應被視為其最大的資產之一。

對於比zlib更現代的東西, libbzip2可能值得一看。 它提供了與zlib類似的接口,以實現兼容性。 在很多情況下,它提供更好的壓縮,但性能成本。

對於比zlib更快的東西(但也不會壓縮......),有LZO

在具有虛擬內存管理器的現代操作系統上執行此操作毫無意義。 你將創建一個對任何東西都沒用的字節blob,在你的虛擬內存地址空間占用空間是沒有充分理由的。 內存管理器不會將它留在RAM中很長時間,它會注意到blob占用的頁面沒有被訪問並將其交換到頁面文件。

此外,如果數據包含指針,則必須翻譯數據。 您可以在完全相同的虛擬內存地址解壓縮數據的幾率,使得指針仍然有效,非常接近於零。 畢竟,你這樣做是為了釋放虛擬內存空間,以前數據使用的漏洞將被其他東西占用。 這種翻譯可能不會是微不足道的,它將需要大量的額外內存。

如果您這樣做是為了避免OOM,請查看對內存映射文件的操作系統支持,並考慮切換到64位代碼。

如果壓縮/解壓縮速度對您很重要,您應該看看LZO:

http://www.oberhumer.com/opensource/lzo/

與zlib相比,代碼更小,更易於使用。

我不知道有什么比zlib更新/更好... zlib工作正常,盡管它的年齡。 zlib的deflateInit()有一個參數,可以讓您將壓縮速度與壓縮大小進行權衡,因此您可以嘗試使用它來查找最適合您應用程序的設置。

可能有C ++包裝器API為你調用zlib C API,如果你想要一些“更漂亮”的東西......或者如果你沒有,那么它很容易編寫你自己的東西。

對於壓縮,數據非常重要。 在內存中壓縮任意二進制數據是完全浪費時間,會極大地降低性能,並可能最終使您的內存使用率更高。

如果你真的需要更多的內存,你應該看看使用VirtualAlloc或sbrk自己控制內存。 這樣你就可以解決所有物理內存,而不僅僅是2-4GB。

暫無
暫無

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

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