Nén dữ liệu dấu phẩy động


26

Có công cụ nào được thiết kế đặc biệt để nén dữ liệu khoa học dấu phẩy động không?

Nếu một chức năng trơn tru, rõ ràng có rất nhiều mối tương quan giữa các số đại diện cho chức năng đó, vì vậy dữ liệu sẽ nén tốt. Nén / gzipping dữ liệu dấu phẩy động nhị phân mặc dù không nén nó tốt. Tôi tự hỏi nếu có phương pháp được phát triển đặc biệt để nén dữ liệu dấu phẩy động.

Yêu cầu:

  • Nén không mất dữ liệu hoặc khả năng chỉ định số chữ số tối thiểu được giữ lại (đối với một số ứng dụng doublecó thể nhiều hơn những gì chúng ta cần trong khi floatcó thể không có đủ độ chính xác).

  • Công cụ làm việc được thử nghiệm tốt (tức là không chỉ là một bài viết mô tả một phương pháp lý thuyết).

  • Thích hợp để nén dữ liệu số 1D (như chuỗi thời gian)

  • Đa nền tảng (phải hoạt động trên Windows)

  • Nó phải nhanh --- tốt nhất là không chậm hơn nhiều so với gzip. Tôi thấy rằng nếu tôi có các số được lưu dưới dạng ASCII, thì việc gzipping tệp có thể tăng tốc độ đọc và xử lý nó (vì thao tác có thể bị ràng buộc I / O).

Tôi đặc biệt muốn nghe từ những người thực sự đã sử dụng một công cụ như vậy.


Điều này một phần được lấy cảm hứng từ sự tồn tại của FLAC , điều này cho thấy rằng một phương pháp chuyên dụng nên làm (nhiều?) Tốt hơn gzip.
Szabolcs

Tôi đang xem xét điều này bây giờ.
Szabolcs

Khéo léo. Tôi sẽ cung cấp cho một xoáy này.
meawoppl

Câu trả lời:


22

Hãy thử Blosc . Đó là trong nhiều trường hợp nhanh hơn memcopy . Hãy suy nghĩ về điều đó trong một giây. . . độc ác.

Nó là siêu ổn định, được đánh giá cao, đa nền tảng và hoạt động như một nhà vô địch.


oh wow, điều này thực sự rất tuyệt (và mới đối với tôi!)
Aron Ahmadia 18/03/2016

Liên kết bị hỏng. Bất cứ cơ hội nào bạn biết nó đang ở đâu?
Alexis Wilke

1
@AlexisWilke Tôi đã sửa liên kết. Đó là kết quả đầu tiên trong một tìm kiếm google cho Blosc.
Doug Lipinski

1
Blosc có thể nhanh nhưng tốc độ nén của nó trên mảng float là một thảm họa. Với độ nén tốt nhất, nó cung cấp kết quả trong khoảng 98% kích thước ban đầu. Cảm ơn các mẹo trong mọi trường hợp.

Nén trên mảng nổi phụ thuộc rất nhiều vào nội dung. Tôi nghi ngờ có rất ít thông tin (có cấu trúc) trong các bit bạn đang nén. Ngoài ra, blosc vẫn còn hoạt động dev 5 năm sau!
meawoppl

7

Tôi đã nhận được kết quả tốt khi sử dụng HDF5 và bộ lọc GZIP của nó.

HDF5 cũng cung cấp bộ lọc SZIP để đạt được kết quả tốt hơn cho một số bộ dữ liệu khoa học.

Theo kinh nghiệm của tôi, việc lựa chọn nén phụ thuộc rất nhiều vào loại dữ liệu và điểm chuẩn có lẽ là cách duy nhất để đưa ra lựa chọn tốt.

BTW, bộ lọc của bên thứ ba cho HDF5 bao gồm BLOSC, BZIP2, LZO, LZF, MAFISC.


Cảm ơn fot câu trả lời! Tôi chưa sử dụng HDF5 nhiều. Có đúng không khi sử dụng bộ lọc gzip với định dạng HDF5 sẽ mang lại cho tôi tỷ lệ nén giống như ghi tất cả số vào một tệp nhị phân phẳng và chạy nó qua gzip? (Bỏ qua sự tiện lợi / bất tiện có thể có của việc sử dụng HDF5 ngay bây giờ.) Về SZIP, theo cách nào đó, nó có được tối ưu hóa cho các bộ dữ liệu dấu phẩy động không? (Tôi tò mò và điều này không rõ ràng từ việc lướt qua trang bạn đã liên kết.) Trang này cho biết ưu điểm chính của SZIP là tốc độ. GZIP cũng khá linh hoạt (thường thì việc giải nén gzip không đáng kể đối với tôi).
Szabolcs

Một tệp nhị phân phẳng được nén có thể sẽ nhỏ hơn tệp HDF5 với bộ lọc gzip, vì HDF5 không chỉ là dữ liệu thô. Đôi khi tiền xử lý với bộ lọc ngẫu nhiên có thể cải thiện kết quả gzip. Nhưng bạn đã đúng, những lợi thế thực sự là khá thuận tiện. Với HDF5, tôi thấy dễ dàng thay đổi bộ lọc nén (thử các cài đặt khác nhau) và HDF5 cung cấp chức năng để tích hợp các tập hợp con của dữ liệu của bạn (các khoảng thời gian trong chuỗi thời gian).
f3lix

1
Nếu bạn đi tuyến đường này hãy kiểm tra pyTables . Nó làm cho ở trên chỉ là một vài dòng mã. Được duy trì (ít nhất là trước đây) bởi tác giả Blosc.
meawoppl

6

Có thể cho rằng, bạn có thể hiểu các phương thức hồi quy hoặc biến đổi (biến đổi Fourier, biến đổi Ch Quashev) là "nén" cho dữ liệu hàm chuỗi thời gian hoặc chuỗi 1D. Thuật toán của Remez sẽ là một ứng cử viên khác. Trong trường hợp đó, sử dụng một cái gì đó như hồi quy, FFT hoặc Ch Quashev thông qua FFT sẽ hoạt động cho mục đích của bạn. Điều đó nói rằng, không có phương pháp nào trong số này hoạt động trên dữ liệu chuỗi thời gian với cấu trúc tùy ý . Ví dụ: với FFT, bạn giả định tính định kỳ và bất kỳ loại gián đoạn nào trong dữ liệu (hoặc thiếu tính định kỳ) sẽ dẫn đến hiện tượng Gibbs . Tương tự, với các phép biến đổi Ch Quashev, giả định là dữ liệu mô tả một hàm trên .[1,1]

Tùy thuộc vào chức năng cơ bản, bạn có thể điều chỉnh dữ liệu thành biểu mẫu chức năng mà không gặp lỗi, yêu cầu ít hệ số hơn để mô tả biểu mẫu chức năng so với điểm dữ liệu của bạn (dẫn đến nén). Kết quả lỗi tồn tại cho một số trong những phương pháp, mặc dù tôi không biết nếu bất kỳ trong số họ sẽ cung cấp cho bạn một tiên nghiệm (hoặc một posteriori ) giới hạn hoặc ước tính về lỗi.

Bạn cũng có thể xem xét các phương thức được phát triển đặc biệt để nén các số dấu phẩy động, như FPC và các thuật toán liên quan. Xem các giấy tờ ở đây , ở đây , ở đây , ở đây , và ở đây , cùng với một trang web có chứa mã nguồn cũ ở đây .


Trên thực tế, tôi quan tâm đến các công cụ làm sẵn tương tự như gzip không yêu cầu bất kỳ công việc nào của tôi, đặc biệt là không phát triển và điều chỉnh phương pháp của riêng tôi. Ngoài ra, sẽ rất thuận lợi khi có một phương thức không yêu cầu đọc toàn bộ vào bộ nhớ trước khi giải nén nó vì tôi có thể có các tệp dữ liệu rất lớn có thể được xử lý tuần tự (cách này hoạt động với gzip, nhưng không phải nếu tôi sử dụng Fourier biến đổi, trừ khi tôi tự cắt dữ liệu thành các khối, làm phức tạp toàn bộ hơn nữa) Một cái gì đó giả định rằng tệp dữ liệu của tôi chỉ là một chuỗi các nhân đôi nhị phân sẽ là tuyệt vời.
Szabolcs

Ngoài ra đây là các phép biến đổi 1: 1 không thực sự là kỹ thuật nén. Chúng có thể được sử dụng để tạo dữ liệu mà thuật toán nén ngây thơ có thể làm tốt hơn, nhưng độc lập không phải là một giải pháp.
meawoppl

Một số phương pháp này tạo thành cơ sở toán học cho các thuật toán nén được sử dụng trong xử lý tín hiệu, đó là ý tưởng đằng sau câu trả lời. Những biến đổi này thường không phải là 1: 1 trừ những trường hợp đặc biệt.
Geoff Oxberry

3

HDF5 có thể sử dụng thuật toán "xáo trộn" trong đó các byte cho N số dấu phẩy động được sắp xếp lại sao cho các byte đầu tiên của số N đến trước, sau đó là thứ 2, v.v. Điều này tạo ra tỷ lệ nén tốt hơn sau khi gzip được áp dụng, vì nó có nhiều khả năng tạo ra các chuỗi dài hơn có cùng giá trị. Xem ở đây cho một số điểm chuẩn .


1

SZ (được phát triển bởi Argonne vào năm 2016) có thể là một lựa chọn tốt.

SZ: Máy nén dữ liệu dấu phẩy động có lỗi nhanh cho các ứng dụng khoa học https://collab.cels.anl.gov/display/ESR/SZ


Tại sao bạn nghĩ rằng nó có thể là một lựa chọn tốt? Khả năng của nó so với các kỹ thuật nén khác là gì?
Paul

1

Các phương thức có thể, có thể được sử dụng để nén dấu phẩy động:

  • Chuyển đổi 4xN cho float và 8xN cho double + lz77
    Thực hiện: Nén điểm nổi trong TurboTranspose
    xem thêm nén mất mát bị ràng buộc lỗi

  • Công cụ dự đoán (ví dụ: Phương pháp ngữ cảnh hữu hạn) + mã hóa (ví dụ: "nén số nguyên").
    Triển khai: Nén điểm nổi trong TurboPFor
    bao gồm nén đặc biệt cho chuỗi thời gian.

  • khi có thể, hãy chuyển đổi tất cả các số dấu phẩy động sang số nguyên (ví dụ: 1,63 -> 163), sau đó sử dụng nén số nguyên

  • Bạn có thể kiểm tra tất cả các phương thức này với dữ liệu của mình bằng công cụ icapp cho linux và windows.


1

Chúng tôi đã sử dụng ZFP với HDF5 cho dữ liệu hình ảnh y tế của chúng tôi. Nó được thực hiện cho mất mát, nén điểm nổi.

Chúng tôi đang chạy nó trên mọi thứ theo nghĩa đen và có hơn 40TB dữ liệu được lưu trữ (và đang được sử dụng!). Nó đủ nhanh để lưu dữ liệu của chúng tôi theo thời gian thực và chúng tôi có thể chỉ định độ chính xác cần thiết, vì vậy trong khi định dạng bị mất, chúng tôi không thấy bất kỳ sự khác biệt nào trong các đầu ra cuối cùng của chúng tôi.


0

Nếu một chức năng trơn tru, rõ ràng có rất nhiều mối tương quan giữa các số đại diện cho chức năng đó, vì vậy dữ liệu sẽ nén tốt.

Có lẽ định dạng bạn yêu cầu chỉ cần lưu trữ các giá trị bù từ giá trị này sang giá trị lân cận.

Cách khác, có thể bạn có thể sử dụng miền tần số, thậm chí có thể lưu các giá trị này dưới dạng tệp âm thanh không bị mất như "flac lossless", vì bạn yêu cầu một số thuộc tính tương tự cho âm thanh.

Tuy nhiên, tôi sẽ thực hiện một cách tiếp cận khác để cố gắng trả lời câu hỏi mà tôi hy vọng có thể giúp ích được gì đó. Như những gì bạn đang nói cũng là độ dài mô tả tối thiểu để thể hiện dữ liệu này ít hơn việc cung cấp tất cả các điểm dữ liệu.

https://en.wikipedia.org/wiki/Minimum_description_length

Hiệu quả một chương trình, mã máy tính, là một ví dụ tốt. Và nếu bạn không bận tâm rằng một cái gì đó chủ yếu là dữ liệu hoạt động bằng cách thực thi và cũng là mã, thì bạn có thể nén các giá trị dấu phẩy động của mình vào một thứ gì đó như hàm hoặc định dạng.

Làm điều này đặc biệt tốt tự động, và trong một số lượng tính toán thực tế, vượt quá khó. Tuy nhiên, Ngôn ngữ Wolfram cung cấp một số chức năng để thử điều này:

https://reference.wolfram.com/lingu/ref/FindSequenceFunction.html https://reference.wolfram.com/lingu/ref/FindGeneratingFunction.html https://reference.wolfram.com/lingu/ref/FindFormula. html

https://reference.wolfram.com/lingu/ref/RSolve.html


0

Tại sao không chỉ lưu float32 / float16? Trong numpy,

A.astype( np.float32 )  # 100M: 200 msec imac
A.astype( np.float16 )  # 100M: 700 msec

Những điều này sẽ không xảy ra nếu bạn mô phỏng hiệu ứng Bướm trong lý thuyết hỗn loạn, nhưng chúng có thể hiểu được, có thể mang theo được, "không yêu cầu bất kỳ công việc nào từ phía tôi". Và nén 2: 1/4: 1 trên float64 rất khó để đánh bại :)

Ghi chú:

"Kiểu mảng float16 không được hỗ trợ trong np.linalg"; bạn sẽ phải mở rộng nó lên 32 hoặc 64 sau khi đọc nó.

Để xem các tham số dấu phẩy động khác nhau như thế nào,

import numpy as np
for f in [np.float64, np.float32, np.float16]:
    print np.finfo(f)

Để biết sơ đồ của một trường hợp thử nghiệm tầm thường so sánh float 64 32 và 16, xem tại đây .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.