การบีบอัดข้อมูลทศนิยม


26

มีเครื่องมือใดที่ออกแบบมาเป็นพิเศษสำหรับการบีบอัดข้อมูลทางวิทยาศาสตร์จุดลอยตัวหรือไม่?

หากฟังก์ชั่นราบรื่นมีความสัมพันธ์กันอย่างชัดเจนระหว่างตัวเลขที่แสดงถึงฟังก์ชันนั้นดังนั้นข้อมูลควรบีบอัดได้ดี Zipping / gzipping ข้อมูลเลขทศนิยมแบบไบนารีไม่ได้บีบอัดข้อมูล ฉันสงสัยว่ามีวิธีที่พัฒนาขึ้นเป็นพิเศษสำหรับการบีบอัดข้อมูลจุดลอย

ที่ต้องการ:

  • การบีบอัดแบบไม่สูญเสียข้อมูลหรือความเป็นไปได้ในการระบุจำนวนตัวเลขขั้นต่ำที่จะเก็บ (สำหรับบางแอปพลิเคชันdoubleอาจมากกว่าสิ่งที่เราต้องการในขณะที่floatอาจมีความแม่นยำไม่เพียงพอ)

  • เครื่องมือการทำงานที่ผ่านการทดสอบเป็นอย่างดี (ไม่ใช่แค่กระดาษที่อธิบายวิธีการทางทฤษฎี)

  • เหมาะสำหรับการบีบอัดข้อมูลตัวเลข 1D (เช่นอนุกรมเวลา)

  • ข้ามแพลตฟอร์ม (ต้องทำงานบน Windows)

  • มันจะต้องเร็ว --- โดยเฉพาะอย่างยิ่งไม่ช้ากว่า gzip ฉันพบว่าหากฉันมีตัวเลขที่เก็บไว้เป็น ASCII การบีบอัดไฟล์สามารถเพิ่มความเร็วในการอ่านและประมวลผล (เนื่องจากการดำเนินการอาจเป็น I / O ที่ถูกผูกไว้)

โดยเฉพาะอย่างยิ่งฉันต้องการได้ยินจากผู้ที่ใช้เครื่องมือดังกล่าว


นี่เป็นส่วนหนึ่งที่ได้รับแรงบันดาลใจจากการมีอยู่ของFLACซึ่งแสดงให้เห็นว่าวิธีการเฉพาะควรทำได้ดีกว่า gzip (มาก?)
Szabolcs

ฉันกำลังมองหาที่นี้ตอนนี้
Szabolcs

เรียบร้อย ฉันจะให้อันนี้หมุนวน
meawoppl

คำตอบ:


22

ลองBlosc มันมีอยู่ในหลายกรณีได้เร็วกว่า memcopy ลองคิดดูสักครู่ . . ชั่วร้าย

มันมีเสถียรภาพมากตรวจสอบข้ามแพลตฟอร์มและทำงานเหมือนแชมป์


โอ้ว้าวนี่มันเจ๋งจริงๆ (และใหม่สำหรับฉัน!)
Aron Ahmadia

ลิงก์เสีย โอกาสใดที่คุณจะรู้ว่าตอนนี้อยู่ที่ไหน?
Alexis Wilke

1
@AlexisWilke ฉันแก้ไขลิงก์แล้ว มันเป็นผลครั้งแรกในการค้นหา google สำหรับ Blosc
Doug Lipinski

1
Blosc อาจเร็ว แต่อัตราการบีบอัดของมันบนอาร์เรย์แบบลอยนั้นเป็นหายนะ ด้วยการบีบอัดที่ดีที่สุดมันให้ผลลัพธ์ประมาณ 98% ของขนาดดั้งเดิม ขอบคุณสำหรับเคล็ดลับในกรณีใด ๆ

การบีบอัดบนอาร์เรย์ลอยขึ้นอยู่กับเนื้อหาอย่างมาก ฉันสงสัยว่ามีข้อมูลเล็กน้อย (มีโครงสร้าง) ในบิตที่คุณกำลังบีบอัด นอกจากนี้ blosc ยังอยู่ภายใต้การพัฒนา 5 ปีต่อมา!
meawoppl

7

ฉันได้ผลลัพธ์ที่ดีโดยใช้HDF5และตัวกรอง GZIP

HDF5 ยังมีตัวกรองSZIPซึ่งให้ผลลัพธ์ที่ดีกว่าสำหรับชุดข้อมูลวิทยาศาสตร์บางชุด

จากประสบการณ์ของฉันการเลือกการบีบอัดขึ้นอยู่กับชนิดของข้อมูลและการเปรียบเทียบอาจเป็นวิธีเดียวที่จะทำให้เป็นทางเลือกที่ดี

BTW, ฟิลเตอร์บุคคลที่สามสำหรับ HDF5 ประกอบด้วย BLOSC, BZIP2, LZO, LZF, MAFISC


ขอบคุณ fot คำตอบ! ฉันไม่ได้ใช้ HDF5 มาก ถูกต้องหรือไม่ว่าการใช้ตัวกรอง gzip กับรูปแบบ HDF5 จะให้อัตราส่วนการบีบอัดแบบเดียวกับที่ฉันเขียนจำนวนทั้งหมดลงในไฟล์ไบนารีแบบแฟลตและเรียกใช้ผ่าน gzip หรือไม่ (ไม่สนใจความสะดวกสบาย / ความไม่สะดวกที่อาจเกิดขึ้นจากการใช้ HDF5 ในตอนนี้) เกี่ยวกับ SZIP เป็นวิธีการที่เหมาะสำหรับชุดข้อมูลจุดลอยตัวหรือไม่? (ฉันอยากรู้อยากเห็นและสิ่งนี้ไม่ชัดเจนจากการอ่านหน้าเว็บที่คุณเชื่อมโยงกัน) หน้าพูดว่าประโยชน์หลักของ SZIP คือความเร็ว GZIP นั้นค่อนข้างเร็ว (โดยทั่วไปการบีบอัด gzip นั้นใช้เวลาเล็กน้อยสำหรับฉัน)
Szabolcs

ไฟล์ไบนารีแฟล็ต gzipped อาจมีขนาดเล็กกว่าไฟล์ HDF5 ที่มีตัวกรอง gzip เนื่องจาก HDF5 เป็นมากกว่าข้อมูลดิบ บางครั้งการประมวลผลล่วงหน้าด้วยตัวกรองแบบสุ่มสามารถปรับปรุงผลลัพธ์ gzip แต่คุณพูดถูกจริงๆข้อดีนั้นค่อนข้างจะสะดวกกว่า ด้วย HDF5 ฉันคิดว่ามันง่ายที่จะเปลี่ยนฟิลเตอร์การบีบอัด (ลองใช้การตั้งค่าที่แตกต่างกัน) และ HDF5 มีฟังก์ชั่นเพื่อ acces ชุดย่อยของข้อมูลของคุณ (ช่วงเวลาในอนุกรมเวลา)
f3lix

1
ถ้าคุณไปตรวจสอบเส้นทางนี้ออกpyTables มันทำให้ข้างต้นเป็นเพียงไม่กี่บรรทัดของรหัส ปรับปรุง (ก่อนหน้านี้อย่างน้อย) โดยผู้เขียน Blosc
meawoppl

6

[1,1]

ขึ้นอยู่กับฟังก์ชั่นพื้นฐานคุณอาจจะพอดีกับข้อมูลในรูปแบบการทำงานโดยไม่มีข้อผิดพลาดต้องการค่าสัมประสิทธิ์น้อยลงเพื่ออธิบายรูปแบบการทำงานกว่าที่คุณมีจุดข้อมูล (นำไปสู่การบีบอัด) ผลการค้นหาข้อผิดพลาดที่มีอยู่สำหรับบางส่วนของวิธีการเหล่านี้ แต่ผมไม่ทราบว่าถ้าใด ๆ ของพวกเขาจะทำให้คุณเบื้องต้น (หรือposteriori ) ขอบเขตหรือประมาณการเกี่ยวกับข้อผิดพลาด

นอกจากนี้คุณยังสามารถดูวิธีการที่พัฒนาขึ้นโดยเฉพาะสำหรับการบีบอัดของตัวเลขทศนิยมเช่น FPC และอัลกอริทึมที่เกี่ยวข้อง ดูเอกสารที่นี่ , ที่นี่ , ที่นี่ , ที่นี่และที่นี่พร้อมกับหน้าเว็บที่มีรหัสที่มาเก่าที่นี่


ที่จริงแล้วฉันสนใจในเครื่องมือสำเร็จรูปที่คล้ายกับ gzip ที่ไม่ต้องการงานใด ๆ ในส่วนของฉันโดยเฉพาะอย่างยิ่งไม่พัฒนาและปรับวิธีการของตัวเอง นอกจากนี้มันจะเป็นประโยชน์ที่จะมีวิธีการที่ไม่จำเป็นต้องอ่านข้อมูลทั้งหมดลงในหน่วยความจำก่อนที่จะแตกไฟล์เพราะฉันอาจมีดาต้าไทล์ขนาดใหญ่มากที่สามารถประมวลผลตามลำดับได้ (ใช้งานกับ gzip ได้ แปลงเว้นแต่ว่าฉันจะแบ่งข้อมูลออกเป็นชิ้น ๆ ทำให้ทุกอย่างซับซ้อนยิ่งขึ้น) สิ่งที่คิดว่าดาต้าไทล์ของฉันเป็นเพียงชุดเลขฐานสองที่ดีมาก
Szabolcs

นอกจากนี้ยังเป็นการแปลงแบบ 1: 1 ไม่ใช่เทคนิคการบีบอัด สามารถใช้เพื่อสร้างข้อมูลที่อัลกอริทึมการบีบอัดแบบไร้เดียงสาสามารถทำได้ดีกว่า แต่ไม่ได้เป็นวิธีแก้ปัญหาแบบสแตนด์อโลน
meawoppl

บางส่วนของวิธีการเหล่านี้เป็นพื้นฐานทางคณิตศาสตร์สำหรับอัลกอริทึมการบีบอัดที่ใช้ในการประมวลผลสัญญาณซึ่งเป็นแนวคิดที่อยู่เบื้องหลังคำตอบ โดยทั่วไปการแปลงเหล่านี้จะไม่เป็น 1: 1 ยกเว้นในกรณีพิเศษ
Geoff Oxberry

3

HDF5 สามารถใช้อัลกอริทึม "สับ" โดยที่ไบต์สำหรับตัวเลขทศนิยมที่มีการจัดเรียงใหม่เพื่อให้ไบต์แรกของตัวเลข N มาก่อนแล้วอันดับที่ 2 และอื่น ๆ สิ่งนี้จะสร้างอัตราส่วนการบีบอัดที่ดีขึ้นหลังจากใช้ gzip เนื่องจากมีแนวโน้มที่จะสร้างลำดับที่ยาวกว่าของค่าเดียวกัน ดูที่นี่สำหรับมาตรฐานบางอย่าง


1

SZ (พัฒนาโดย Argonne ในปี 2559) อาจเป็นทางเลือกที่ดี

SZ: คอมเพรสเซอร์ข้อมูลจุดลอยตัวข้อผิดพลาดอย่างรวดเร็วสำหรับการใช้งานทางวิทยาศาสตร์ https://collab.cels.anl.gov/display/ESR/SZ


ทำไมคุณคิดว่ามันอาจเป็นทางเลือกที่ดี? อะไรคือความสามารถในการเปรียบเทียบกับเทคนิคการบีบอัดอื่น ๆ
เปาโล

1

วิธีการที่เป็นไปได้ที่สามารถใช้สำหรับการบีบอัดเลขทศนิยม:

  • Transpose 4xN สำหรับ float และ 8xN สำหรับ double + lz77
    การใช้งาน: การบีบอัดจุดลอยตัวใน TurboTranspose
    ดูการบีบอัด lossy ที่มีข้อผิดพลาด

  • Predictor (เช่นวิธีบริบท จำกัด ) + การเข้ารหัส (เช่น "การบีบอัดจำนวนเต็ม")
    การใช้งาน: การบีบอัดจุดลอยตัวใน TurboPFor
    รวมถึงการบีบอัดพิเศษสำหรับอนุกรมเวลา

  • เมื่อเป็นไปได้ให้แปลงตัวเลขทศนิยมทั้งหมดเป็นจำนวนเต็ม (เช่น 1.63 -> 163) จากนั้นใช้การบีบอัดจำนวนเต็ม

  • คุณสามารถทดสอบวิธีการเหล่านี้กับข้อมูลของคุณโดยใช้ เครื่องมือicappสำหรับ linux และ windows


1

เราใช้ZFPกับ HDF5 สำหรับข้อมูลภาพทางการแพทย์ของเรา มันถูกสร้างขึ้นมาเพื่อการสูญเสียการบีบอัดจุดลอย

เราใช้งานทุกสิ่งอย่างแท้จริงและมีการจัดเก็บข้อมูลมากกว่า 40TB (และถูกใช้!) มันเร็วพอที่จะบันทึกข้อมูลของเราตามเวลาจริงและเราสามารถระบุความแม่นยำที่ต้องการดังนั้นในขณะที่รูปแบบสูญเสียเราไม่เห็นความแตกต่างในผลลัพธ์สุดท้ายของเรา


0

หากฟังก์ชั่นราบรื่นมีความสัมพันธ์กันอย่างชัดเจนระหว่างตัวเลขที่แสดงถึงฟังก์ชันนั้นดังนั้นข้อมูลควรบีบอัดได้ดี

บางทีรูปแบบที่คุณต้องการจำเป็นต้องจัดเก็บเพียงแค่ออฟเซ็ตจากค่าเป็นค่าใกล้เคียง

หรือคุณอาจใช้ประโยชน์จากโดเมนความถี่หรือแม้กระทั่งการบันทึกค่าเหล่านี้เป็นไฟล์เสียงแบบไม่สูญเสียเช่น "flac lossless" เนื่องจากคุณต้องใช้คุณสมบัติเดียวกันกับเสียง

อย่างไรก็ตามฉันจะใช้วิธีการที่แตกต่างกันในการพยายามตอบคำถามที่ฉันหวังว่าจะสามารถช่วยเหลือได้ สิ่งที่คุณพูดคือความยาวของคำอธิบายขั้นต่ำในการแสดงข้อมูลนี้น้อยกว่าการให้จุดข้อมูลทั้งหมด

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

โปรแกรมคอมพิวเตอร์อย่างมีประสิทธิภาพเป็นตัวอย่างที่ดี และถ้าคุณไม่คิดว่าสิ่งใดที่ข้อมูลส่วนใหญ่ทำงานโดยการดำเนินการและเป็นรหัสแล้วคุณสามารถบีบอัดค่าจุดลอยตัวของคุณเป็นสิ่งต่าง ๆ เช่นฟังก์ชั่นหรือ formuli

การทำสิ่งนี้โดยอัตโนมัติเป็นอย่างดีและในจำนวนที่คำนวณได้จริงนั้นยากเกินกว่าที่จะทำได้ อย่างไรก็ตามภาษา Wolfram มีฟังก์ชั่นบางอย่างเพื่อลอง:

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

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


0

ทำไมไม่เพียงแค่บันทึก float32 / float16 ในจำนวนมาก

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

สิ่งเหล่านี้จะไม่ทำถ้าคุณจำลองเอ ฟเฟกต์ของผีเสื้อในทฤษฎีความโกลาหล แต่พวกมันสามารถเข้าใจได้พกพาได้ "ไม่ต้องการงานใด ๆ ในส่วนของฉัน" และการบีบอัด 2: 1/4: 1 บน float64 นั้นยากที่จะเอาชนะ :)

หมายเหตุ:

"ไม่รองรับประเภท float16 ในอาร์เรย์ใน np.linalg"; คุณจะต้องขยายเป็น 32 หรือ 64 หลังจากอ่านมัน

หากต้องการดูว่าพารามิเตอร์จุดลอยตัวแตกต่างกันอย่างไร

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

สำหรับพล็อตของกรณีทดสอบเล็กน้อยเมื่อเทียบลอย 64 32 และ 16 ให้ดู ที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.