Mengenai kaedah pelik untuk menjimatkan ruang cakera keras

Pengguna lain ingin menulis sekeping data baharu ke cakera keras, tetapi dia tidak mempunyai ruang kosong yang mencukupi untuk melakukan ini. Saya juga tidak mahu memadamkan apa-apa, kerana "semuanya sangat penting dan perlu." Dan apa yang harus kita lakukan dengannya?

Tiada siapa yang mempunyai masalah ini. Terdapat terabait maklumat pada cakera keras kami, dan jumlah ini tidak cenderung berkurangan. Tetapi betapa uniknya? Pada akhirnya, semua fail hanyalah set bit dengan panjang tertentu dan, kemungkinan besar, fail baharu tidak jauh berbeza daripada yang telah disimpan.

Jelas sekali bahawa mencari cebisan maklumat yang telah disimpan pada cakera keras adalah, jika bukan kegagalan, maka sekurang-kurangnya bukan tugas yang berkesan. Sebaliknya, jika perbezaannya kecil, maka anda boleh menyesuaikannya sedikit ...

Mengenai kaedah pelik untuk menjimatkan ruang cakera keras

TL;DR - percubaan kedua untuk bercakap tentang kaedah pelik untuk mengoptimumkan data menggunakan fail JPEG, kini dalam bentuk yang lebih mudah difahami.

Mengenai bit dan perbezaan

Jika anda mengambil dua keping data rawak sepenuhnya, maka secara purata separuh daripada bit yang terkandung di dalamnya bertepatan. Malah, antara susun atur yang mungkin untuk setiap pasangan ('00, 01, 10, 11β€²), betul-betul separuh mempunyai nilai yang sama, semuanya mudah di sini.

Tetapi sudah tentu, jika kita hanya mengambil dua fail dan menyesuaikan satu dengan yang kedua, maka kita akan kehilangan salah satu daripadanya. Jika kami menyimpan perubahan, kami hanya akan mencipta semula pengekodan delta, yang wujud dengan sempurna tanpa kita, walaupun ia biasanya tidak digunakan untuk tujuan yang sama. Kami boleh cuba membenamkan jujukan yang lebih kecil ke dalam jujukan yang lebih besar, tetapi kami berisiko kehilangan segmen data kritikal jika kami menggunakannya secara melulu dengan segala-galanya.

Antara apa dan apa kemudiannya perbezaan itu boleh dihapuskan? Nah, iaitu, fail baharu yang ditulis oleh pengguna hanyalah urutan bit, yang dengannya kita tidak boleh melakukan apa-apa dengan sendirinya. Kemudian anda hanya perlu mencari bit sedemikian pada cakera keras yang boleh ditukar tanpa perlu menyimpan perbezaannya, supaya anda boleh bertahan dengan kehilangannya tanpa akibat yang serius. Dan masuk akal untuk menukar bukan sahaja fail pada FS itu sendiri, tetapi beberapa maklumat yang kurang sensitif di dalamnya. Tetapi yang mana satu dan bagaimana?

Kaedah pemasangan

Fail mampat yang hilang datang untuk menyelamatkan. Semua jpeg, mp3 dan lain-lain ini, walaupun mampatan lossy, mengandungi sekumpulan bit yang boleh ditukar dengan selamat. Anda boleh menggunakan teknik lanjutan yang mengubah suai komponennya secara tidak ketara pada pelbagai peringkat pengekodan. Tunggu. Teknik lanjutan... pengubahsuaian yang tidak dapat dilihat... sedikit ke dalam yang lain... ia hampir seperti steganografi!

Sesungguhnya, membenamkan satu maklumat ke dalam yang lain mengingatkan kaedahnya seperti tiada yang lain. Saya juga kagum dengan ketidakjelasan perubahan yang dilakukan kepada deria manusia. Di mana laluan menyimpang adalah dalam kerahsiaan: tugas kami terletak kepada pengguna memasukkan maklumat tambahan ke cakera kerasnya; ia hanya akan membahayakannya. Dia akan lupa lagi.

Oleh itu, walaupun kita boleh menggunakannya, kita perlu membuat beberapa pengubahsuaian. Dan kemudian saya akan memberitahu dan menunjukkan kepada mereka menggunakan contoh salah satu kaedah sedia ada dan format fail biasa.

Mengenai serigala

Jika anda benar-benar memerahnya, ia adalah perkara yang paling mudah dimampatkan di dunia. Kami, sudah tentu, bercakap tentang fail JPEG. Bukan sahaja terdapat banyak alat dan kaedah sedia ada untuk membenamkan data ke dalamnya, tetapi ia adalah format grafik yang paling popular di planet ini.

Mengenai kaedah pelik untuk menjimatkan ruang cakera keras

Walau bagaimanapun, untuk tidak terlibat dalam pembiakan anjing, anda perlu mengehadkan bidang aktiviti anda dalam fail format ini. Tiada siapa yang suka petak monokrom yang muncul disebabkan pemampatan yang berlebihan, jadi anda perlu mengehadkan diri anda untuk bekerja dengan fail yang sudah dimampatkan, mengelakkan pengekodan semula. Lebih khusus lagi, dengan pekali integer, yang kekal selepas operasi yang bertanggungjawab untuk kehilangan data - DCT dan kuantisasi, yang dipaparkan dengan sempurna dalam skema pengekodan (terima kasih kepada wiki Perpustakaan Negara Bauman):
Mengenai kaedah pelik untuk menjimatkan ruang cakera keras

Terdapat banyak kaedah yang mungkin untuk mengoptimumkan fail jpeg. Terdapat pengoptimuman lossless (jpegtran), terdapat pengoptimuman "tak rugi pun", yang sebenarnya menyumbang sesuatu yang lain, tetapi kami tidak mengambil berat tentang mereka. Lagipun, jika pengguna bersedia untuk membenamkan satu maklumat ke dalam yang lain untuk meningkatkan ruang cakera kosong, maka dia sama ada mengoptimumkan imejnya sejak lama dahulu, atau tidak mahu melakukan ini sama sekali kerana takut kehilangan kualiti.

F5

Seluruh keluarga algoritma sesuai dengan keadaan ini, yang anda boleh membiasakan diri anda dalam pembentangan yang baik ini. Yang paling maju daripada mereka ialah algoritma F5 oleh Andreas Westfeld, bekerja dengan pekali komponen kecerahan, kerana mata manusia paling kurang sensitif terhadap perubahannya. Selain itu, ia menggunakan teknik pembenaman berdasarkan pengekodan matriks, yang memungkinkan untuk membuat lebih sedikit perubahan apabila membenamkan jumlah maklumat yang sama, semakin besar saiz bekas yang digunakan.

Perubahan itu sendiri bermuara kepada mengurangkan nilai mutlak pekali sebanyak satu dalam keadaan tertentu (iaitu, tidak selalu), yang membolehkan anda menggunakan F5 untuk mengoptimumkan storan data pada cakera keras anda. Intinya ialah pekali selepas perubahan sedemikian kemungkinan besar akan menduduki lebih sedikit bit selepas pengekodan Huffman disebabkan oleh pengagihan statistik nilai dalam JPEG, dan sifar baharu akan memberi keuntungan apabila mengekodnya menggunakan RLE.

Pengubahsuaian yang diperlukan bermuara kepada menghapuskan bahagian yang bertanggungjawab untuk kerahsiaan (penyusunan semula kata laluan), yang menjimatkan sumber dan masa pelaksanaan, dan menambah mekanisme untuk bekerja dengan banyak fail dan bukannya satu demi satu. Pembaca tidak mungkin berminat dengan proses perubahan dengan lebih terperinci, jadi mari kita beralih kepada penerangan pelaksanaan.

Berteknologi tinggi

Untuk menunjukkan cara pendekatan ini berfungsi, saya melaksanakan kaedah dalam C tulen dan menjalankan beberapa pengoptimuman kedua-dua dari segi kelajuan pelaksanaan dan ingatan (anda tidak boleh bayangkan berapa berat gambar ini tanpa pemampatan, walaupun sebelum DCT). Cross-platform dicapai menggunakan gabungan perpustakaan libjpeg, pcre ΠΈ tinydir, yang mana kami berterima kasih kepada mereka. Semua ini disusun dengan 'membuat', jadi pengguna Windows ingin memasang beberapa Cygwin untuk diri mereka sendiri untuk penilaian, atau berurusan dengan Visual Studio dan perpustakaan sendiri.

Pelaksanaannya tersedia dalam bentuk utiliti konsol dan perpustakaan. Mereka yang berminat boleh mengetahui lebih lanjut tentang menggunakan yang terakhir dalam readme dalam repositori di Github, pautan yang akan saya lampirkan pada penghujung siaran.

Bagaimana untuk digunakan?

Berhati-hati. Imej yang digunakan untuk pembungkusan dipilih dengan mencari menggunakan ungkapan biasa dalam direktori akar yang diberikan. Setelah selesai, fail boleh dialihkan, dinamakan semula dan disalin sesuka hati dalam sempadannya, menukar fail dan sistem pengendalian, dsb. Walau bagaimanapun, anda harus berhati-hati dan tidak mengubah kandungan segera dalam apa jua cara. Kehilangan nilai walaupun satu bit boleh menjadikannya mustahil untuk memulihkan maklumat.

Setelah selesai, utiliti meninggalkan fail arkib khas yang mengandungi semua maklumat yang diperlukan untuk membongkar, termasuk data tentang imej yang digunakan. Dengan sendirinya, beratnya kira-kira beberapa kilobait dan tidak mempunyai sebarang kesan ketara pada ruang cakera yang diduduki.

Anda boleh menganalisis kapasiti yang mungkin menggunakan bendera '-a': './f5ar -a [folder carian] [Perl-compatible regular expression]'. Pembungkusan dilakukan dengan arahan './f5ar -p [folder carian] [Ungkapan biasa yang serasi dengan Perl] [fail yang dibungkus] [nama arkib]', dan membongkar dengan './f5ar -u [fail arkib] [nama fail yang dipulihkan ]' .

Demonstrasi kerja

Untuk menunjukkan keberkesanan kaedah itu, saya memuat naik koleksi 225 foto anjing percuma dari perkhidmatan Unsplash dan mendapati dalam dokumen pdf besar 45 meter jilid kedua Seni Pengaturcaraan Knuta.

Urutannya agak mudah:

$ du -sh knuth.pdf dogs/
44M knuth.pdf
633M dogs/

$ ./f5ar -p dogs/ .*jpg knuth.pdf dogs.f5ar
Reading compressing file... ok
Initializing the archive... ok
Analysing library capacity... done in 17.0s
Detected somewhat guaranteed capacity of 48439359 bytes
Detected possible capacity of upto 102618787 bytes
Compressing... done in 39.4s
Saving the archive... ok

$ ./f5ar -u dogs/dogs.f5ar knuth_unpacked.pdf
Initializing the archive... ok
Reading the archive file... ok
Filling the archive with files... done in 1.4s
Decompressing... done in 21.0s
Writing extracted data... ok

$ sha1sum knuth.pdf knuth_unpacked.pdf
5bd1f496d2e45e382f33959eae5ab15da12cd666 knuth.pdf
5bd1f496d2e45e382f33959eae5ab15da12cd666 knuth_unpacked.pdf

$ du -sh dogs/
551M dogs/

Tangkapan skrin untuk peminat

Mengenai kaedah pelik untuk menjimatkan ruang cakera keras

Fail yang tidak dibungkus boleh dan masih harus dibaca:

Mengenai kaedah pelik untuk menjimatkan ruang cakera keras

Seperti yang anda lihat, daripada data asal 633 + 36 == 669 megabait pada cakera keras, kami sampai ke 551 yang lebih menyenangkan. Perbezaan radikal sedemikian dijelaskan oleh penurunan nilai pekali, yang mempengaruhi mereka pemampatan tanpa kehilangan seterusnya: mengurangkan satu demi satu boleh dengan mudah " memotong beberapa bait daripada fail akhir. Walau bagaimanapun, ini masih kehilangan data, walaupun sangat kecil, yang anda perlu hadapi.

Nasib baik, mereka sama sekali tidak dapat dilihat oleh mata. Di bawah spoiler (memandangkan habrastorage tidak dapat mengendalikan fail besar), pembaca boleh menilai perbezaan kedua-dua mata dan keamatannya, diperoleh dengan menolak nilai komponen yang diubah daripada yang asal: yang asal, dengan maklumat di dalam, perbezaan (lebih kusam warna, lebih kecil perbezaan dalam blok).

Daripada kesimpulan

Memandangkan semua kesukaran ini, membeli cakera keras atau memuat naik segala-galanya ke awan mungkin kelihatan seperti penyelesaian yang lebih mudah untuk masalah itu. Tetapi walaupun kita hidup dalam masa yang begitu indah sekarang, tidak ada jaminan bahawa esok masih ada kemungkinan untuk pergi ke dalam talian dan memuat naik semua data tambahan anda di suatu tempat. Atau pergi ke kedai dan beli sendiri cakera keras seribu terabait lagi. Tetapi anda sentiasa boleh menggunakan rumah sedia ada.

-> GitHub

Sumber: www.habr.com

Tambah komen