2010-01-02 33 views
5

Tôi đã googled cho bộ nhớ trong bộ nhớ và tìm thấy khá một vài thư viện cung cấp chức năng này. zlib dường như được sử dụng rộng rãi - nhưng nó cũng có vẻ khá cũ. Tôi hỏi ở đây liệu có những lựa chọn thay thế mới hơn hay không.C++ thư viện nén trong bộ nhớ nào?

Dữ liệu tôi muốn nén trong bộ nhớ là bộ nhớ có kích thước vài megabyte (2-16 MB) và mỗi khối đó chứa dữ liệu của hai cấu trúc khác nhau cũng như một số mảng con trỏ. bên trong các khối, không có thứ tự cụ thể cho các cấu trúc và các mảng, chúng chỉ được cấp phát sau khi các ứng dụng khác cần tạo ra một phần tử như vậy.

Bạn muốn gợi ý lib nén nào cho điều này? hiệu suất nén và giải nén (cả hai) quan trọng hơn chất lượng nén. Ngoài ra - vì lý do nén - nó sẽ là tốt hơn để có hồ bơi riêng biệt cho hai cấu trúc khác nhau cũng như các mảng, chẳng hạn như mỗi datablock được nén chỉ chứa một loại dữ liệu không? Có phải không?

Đây là lần đầu tiên tôi định sử dụng nén trong bộ nhớ và tôi biết câu hỏi của tôi có thể quá chung chung để đưa ra câu trả lời hay - nhưng mọi gợi ý đều được chào đón!

thx!

+1

Tôi sẽ ngạc nhiên nếu bất kỳ thư viện nén nào xử lý chính xác với con trỏ. –

+1

các con trỏ trên thực tế chỉ là địa chỉ offsets để bắt đầu của hồ bơi – Mat

Trả lời

9

zlib là tốt. Đã được chứng minh, thực hiện và được nhiều người hiểu. Đó là những gì tôi sẽ sử dụng theo mặc định trong một hệ thống mới giống như những gì bạn mô tả. Tuổi của nó nên được xem là một trong những tài sản lớn nhất của nó.

0

Tôi không biết bất cứ điều gì mới hơn/tốt hơn so với zlib ... zlib hoạt động tốt, bất kể tuổi tác của nó. deflateInit() của zlib có một đối số cho phép bạn trao đổi tốc độ nén với kích thước nén, vì vậy bạn có thể thử nghiệm với điều đó để tìm cài đặt hoạt động tốt nhất cho ứng dụng của bạn.

Có thể có API C++ wrapper gọi API zlib C cho bạn, nếu bạn muốn cái gì đó "đẹp hơn" ... hoặc nếu không có, nó đủ dễ dàng để viết của riêng bạn.

+1

Trong một số (nhiều?) Ứng dụng, núm sức mạnh nén của zlib không phải là tất cả những gì hữu ích. Nó có thể làm cho quá trình nén mất nhiều thời gian hơn, nhưng có thể không làm giảm kích cỡ đầu ra nhiều như chỉ đơn giản bằng cách sử dụng một hệ thống khác (như bzip2, có thể nén cực hơn zlib ở cài đặt tối đa, mặc dù với chi phí lớn về tốc độ). Tuy nhiên, tốt để chỉ nó ra. –

3

Để có gì đó hiện đại hơn zlib, libbzip2 có thể đáng xem. Nó cung cấp một giao diện tương tự như zlib, để tương thích. Trong nhiều trường hợp, nó cung cấp nén tốt hơn, nhưng với chi phí hiệu suất.

Để có gì đó nhanh hơn zlib (nhưng cũng không nén được ..) có LZO.

+0

bzip2 không phù hợp khi yêu cầu tốc độ cao. –

+0

(như tôi đã nói - nén tốt hơn, nhưng với chi phí hiệu suất) – user242275

1

Không có ý nghĩa khi thực hiện điều này trên các hệ điều hành hiện đại với trình quản lý bộ nhớ ảo. Bạn sẽ tạo một blob các byte không hữu ích cho bất cứ thứ gì, chiếm không gian trong không gian địa chỉ bộ nhớ ảo của bạn vì không có lý do chính đáng. Trình quản lý bộ nhớ sẽ không để nó trong RAM trong một thời gian dài, nó sẽ thông báo rằng các trang bị chiếm bởi blob sẽ không được truy cập và trao đổi nó với tệp hoán trang.

Ngoài ra, bạn sẽ phải dịch dữ liệu nếu nó chứa con trỏ. Các tỷ lệ cược rằng bạn sẽ có thể giải nén dữ liệu ở cùng một địa chỉ bộ nhớ ảo chính xác, để các con trỏ vẫn còn hợp lệ, rất gần bằng không. Sau khi tất cả, bạn đã làm điều này để giải phóng không gian bộ nhớ ảo, lỗ trước đây được sử dụng bởi các dữ liệu sẽ bị chiếm đóng bởi cái gì khác. Bản dịch này có lẽ sẽ không tầm thường và nó sẽ mất rất nhiều bộ nhớ bổ sung.

Nếu bạn đang thực hiện điều này để tránh OOM, hãy xem hỗ trợ hệ điều hành cho các tệp ánh xạ bộ nhớ và cân nhắc chuyển sang mã 64 bit.

+0

các con trỏ là các dời địa chỉ vào các bộ nhớ. tôi đã không thực sự hiểu vấn đề với phân trang. tôi cần nén vì tôi có một hệ thống thời gian thực tạo và tái sử dụng một lượng lớn dữ liệu – Mat

+0

Phân trang không phải lúc nào cũng có sẵn! Ví dụ. Tôi vô hiệu hóa nó trên máy tính của tôi vì nó làm cho nó phản ứng nhanh hơn nhiều và không làm cạn kiệt SSD của tôi! – abergmeier

1

Nếu tốc độ nén/giải nén là quan trọng đối với bạn, bạn nên có một cái nhìn tại LZO:

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

So với zlib mã nhỏ hơn và dễ dàng hơn để sử dụng là tốt.

0

Để nén, dữ liệu quan trọng rất nhiều. Nén dữ liệu nhị phân tùy ý trong bộ nhớ là một sự lãng phí thời gian hoàn toàn, sẽ làm chậm hiệu suất của bạn vô cùng, và có lẽ sẽ kết thúc làm cho việc sử dụng bộ nhớ của bạn cao hơn.

Nếu bạn thực sự cần có nhiều bộ nhớ hơn, bạn nên xem xét sử dụng VirtualAlloc hoặc sbrk để tự điều khiển bộ nhớ. Bằng cách này bạn có thể giải quyết tất cả bộ nhớ vật lý, không chỉ 2-4gb.