Хатуу дискний зай хэмнэх хачирхалтай аргын тухай

Өөр нэг хэрэглэгч хатуу диск рүү өгөгдлийн шинэ хэсгийг бичихийг хүсч байгаа боловч түүнд үүнийг хийх хангалттай зай байхгүй байна. Би бас юу ч устгахыг хүсэхгүй байна, учир нь "бүх зүйл маш чухал бөгөөд шаардлагатай". Тэгээд бид үүнийг яах ёстой вэ?

Энэ асуудал хэнд ч байхгүй. Манай хатуу диск дээр терабайт мэдээлэл байгаа бөгөөд энэ хэмжээ буурах хандлагатай байдаггүй. Гэхдээ энэ нь хэр өвөрмөц вэ? Эцсийн эцэст бүх файлууд нь тодорхой урттай битүүдийн багц бөгөөд магадгүй шинэ нь хадгалагдсан файлаас тийм ч их ялгаатай биш юм.

Хатуу диск дээр аль хэдийн хадгалагдсан мэдээллийн хэсгүүдийг хайх нь бүтэлгүйтэл биш бол ядаж үр дүнтэй ажил биш гэдэг нь ойлгомжтой. Нөгөөтэйгүүр ялгаа бага байвал бага зэрэг тааруулж болно...

Хатуу дискний зай хэмнэх хачирхалтай аргын тухай

TL;DR - JPEG файлуудыг ашиглан өгөгдлийг оновчтой болгох хачирхалтай аргын тухай ярих хоёр дахь оролдлого нь одоо илүү ойлгомжтой хэлбэрээр.

Бит ба ялгааны тухай

Хэрэв та санамсаргүй байдлаар хоёр ширхэг өгөгдлийг авбал тэдгээрт агуулагдах битүүдийн дундаж тал нь давхцдаг. Үнэн хэрэгтээ, хос бүрийн боломжит загваруудын дунд ('00, 01, 10, 11') яг тал хувь нь ижил утгатай, энд бүх зүйл энгийн байдаг.

Гэхдээ мэдээжийн хэрэг, хэрэв бид хоёр файл аваад нэгийг нь секундэд багтаах юм бол бид тэдгээрийн аль нэгийг нь алдах болно. Хэрэв бид өөрчлөлтүүдийг хадгалвал зүгээр л дахин зохион бүтээх болно дельта кодчилол, энэ нь бидэнгүйгээр төгс оршдог боловч энэ нь ихэвчлэн ижил зорилгоор ашиглагддаггүй. Бид жижиг дарааллыг илүү том дарааллаар оруулахыг оролдож болох ч бид үүнийг бүх зүйлд хайхрамжгүй ашиглавал мэдээллийн чухал сегментүүдийг алдах эрсдэлтэй.

Юу, юуны хоорондох ялгааг арилгах боломжтой вэ? Өөрөөр хэлбэл, хэрэглэгчийн бичсэн шинэ файл бол зүгээр л битүүдийн дараалал бөгөөд бид өөрсдөө юу ч хийж чадахгүй. Дараа нь та хатуу диск дээр ийм битүүдийг олох хэрэгтэй бөгөөд ингэснээр ялгааг хадгалахгүйгээр өөрчлөх боломжтой бөгөөд ингэснээр ноцтой үр дагаваргүйгээр алдагдлыг даван туулах боломжтой болно. Зөвхөн FS дээрх файлыг төдийгүй түүний доторх зарим эмзэг мэдээллийг өөрчлөх нь утга учиртай юм. Гэхдээ аль нь, яаж?

Суулгах аргууд

Алдагдалтай шахсан файлууд аврах ажилд ирдэг. Эдгээр бүх jpeg, mp3 болон бусад файлууд нь алдагдалтай шахалттай боловч аюулгүйгээр өөрчлөх боломжтой олон тооны битүүдийг агуулдаг. Кодчлолын янз бүрийн үе шатанд тэдгээрийн бүрэлдэхүүн хэсгүүдийг үл үзэгдэх байдлаар өөрчилдөг дэвшилтэт техникийг ашиглах боломжтой. Хүлээгээрэй. Дэвшилтэт техникүүд... үл анзаарагдах өөрчлөлт... нэг бит нөгөө рүү... бараг л адилхан стеганографи!

Үнэн хэрэгтээ нэг мэдээллийг нөгөө мэдээлэлд оруулах нь түүний аргуудыг санагдуулдаг. Хүний мэдрэхүйд гарсан өөрчлөлтийг үл анзаарах нь надад бас сэтгэгдэл төрүүлдэг. Замууд нь нууцлагдмал байдаг: бидний даалгавар бол хэрэглэгч өөрийн хатуу диск рүү нэмэлт мэдээлэл оруулах явдал бөгөөд энэ нь зөвхөн түүнд хор хөнөөл учруулах болно. Тэр дахин мартах болно.

Тиймээс, бид тэдгээрийг ашиглаж болох ч зарим өөрчлөлтийг хийх хэрэгтэй. Дараа нь би одоо байгаа аргуудын аль нэг болон нийтлэг файлын форматын жишээн дээр хэлж, харуулах болно.

Чакалуудын тухай

Хэрэв та үүнийг үнэхээр шахаж авбал энэ нь дэлхийн хамгийн шахагдах зүйл юм. Бид мэдээж JPEG файлуудын тухай ярьж байна. Өгөгдлийг оруулах олон арга хэрэгсэл, аргууд байдаг төдийгүй энэ нь дэлхий дээрх хамгийн алдартай график формат юм.

Хатуу дискний зай хэмнэх хачирхалтай аргын тухай

Гэсэн хэдий ч нохойн үржүүлгийн ажилд оролцохгүйн тулд та энэ форматтай файлд үйл ажиллагааны талбараа хязгаарлах хэрэгтэй. Хэт шахалтаас болж харагдах монохром квадратуудад хэн ч дургүй байдаг тул та аль хэдийн шахсан файлтай ажиллахаар өөрийгөө хязгаарлах хэрэгтэй. дахин кодлохоос зайлсхийх. Тодруулбал, мэдээллийн алдагдлыг хариуцдаг үйлдлүүдийн дараа үлддэг бүхэл тооны коэффициентүүд - кодчилолын схемд төгс харуулсан DCT ба квантчлал (Бауманы үндэсний номын сангийн викигийн ачаар):
Хатуу дискний зай хэмнэх хачирхалтай аргын тухай

jpeg файлуудыг оновчтой болгох олон боломжит аргууд байдаг. Алдагдалгүй оновчлол (jpegtran), оновчлол бий "алдагдалгүй", энэ нь үнэндээ өөр зүйлд хувь нэмэр оруулдаг, гэхдээ бид тэдэнд хамаагүй. Эцсийн эцэст, хэрэв хэрэглэгч дискний хоосон зайг нэмэгдүүлэхийн тулд нэг мэдээллийг нөгөө рүү оруулахад бэлэн байгаа бол тэр аль эрт зургуудаа оновчтой болгосон эсвэл чанараа алдахаас айгаад үүнийг хийхийг огт хүсэхгүй байна.

F5

Алгоритмуудын бүхэл бүтэн гэр бүл нь эдгээр нөхцөл байдалд тохирсон бөгөөд та үүнийг мэдэж болно энэ сайхан танилцуулгад. Тэдгээрийн хамгийн дэвшилтэт нь алгоритм юм F5 Хүний нүд түүний өөрчлөлтөд хамгийн бага мэдрэмтгий байдаг тул гэрэлтүүлгийн бүрэлдэхүүн хэсгийн коэффициентүүдтэй ажилладаг Андреас Вестфельд. Түүнчлэн, энэ нь матрицын кодчилол дээр үндэслэсэн шигтгэх аргыг ашигладаг бөгөөд энэ нь ижил хэмжээний мэдээллийг оруулахад бага хэмжээний өөрчлөлт хийх боломжийг олгодог, ашигласан савны хэмжээ том байх тусам.

Өөрчлөлтүүд нь тодорхой нөхцөлд (өөрөөр хэлбэл үргэлж биш) коэффициентүүдийн үнэмлэхүй утгыг нэгээр бууруулахад хүргэдэг бөгөөд энэ нь хатуу диск дээрх өгөгдлийг хадгалахад оновчтой болгохын тулд F5 ашиглах боломжийг олгодог. Хамгийн гол нь ийм өөрчлөлтийн дараах коэффициент нь JPEG дахь утгуудын статистик тархалтаас болж Хаффман кодчилсны дараа цөөн битийг эзлэх магадлалтай бөгөөд шинэ тэгүүд нь RLE ашиглан кодлох үед ашиг өгөх болно.

Шаардлагатай өөрчлөлтүүд нь нөөц, гүйцэтгэлийн цагийг хэмнэж, нууцлалыг хариуцдаг хэсгийг (нууц үгийн өөрчлөлт) арилгаж, нэг нэгээр нь биш олон файлтай ажиллах механизмыг нэмж өгдөг. Уншигч өөрчлөлтийн үйл явцыг илүү дэлгэрэнгүй сонирхохгүй байх тул хэрэгжилтийн тайлбар руу шилжье.

Өндөр технологийн

Энэ арга хэрхэн ажилладагийг харуулахын тулд би энэ аргыг цэвэр C хэл дээр хэрэгжүүлж, гүйцэтгэлийн хурд болон санах ойн хувьд хэд хэдэн оновчлолыг хийсэн (Та DCT-ээс өмнө эдгээр зургуудыг шахахгүйгээр хичнээн жинтэй болохыг та төсөөлж ч чадахгүй). Номын сангуудыг хослуулан ашиглан хөндлөн платформ бий болсон libjpeg, ширхэг и жижиг юм, үүний төлөө бид тэдэнд талархаж байна. Энэ бүгдийг "хийх"-ээр нэгтгэдэг тул Windows хэрэглэгчид үнэлгээний зорилгоор өөрсөддөө зориулж Cygwin суулгах эсвэл Visual Studio болон номын сангуудыг бие даан шийдвэрлэхийг хүсдэг.

Хэрэгжилтийг консолын хэрэгсэл, номын сан хэлбэрээр авах боломжтой. Сонирхсон хүмүүс сүүлийнхийг ашиглах талаар илүү ихийг Github дээрх репозитор дахь Readme хэсгээс олж мэдэх боломжтой бөгөөд энэ холбоосыг би бичлэгийн төгсгөлд хавсаргах болно.

Хэрхэн ашиглах вэ?

Болгоомжтой. Баглаа боодолд ашигласан зургуудыг өгөгдсөн үндсэн лавлахаас ердийн илэрхийлэл ашиглан хайж сонгоно. Дуусгасны дараа файлуудыг өөрийн хүссэнээр зөөж, нэрийг нь өөрчлөх, хуулах, файл болон үйлдлийн системийг өөрчлөх гэх мэт боломжтой. Гэсэн хэдий ч та маш болгоомжтой байж, шууд агуулгыг ямар ч байдлаар өөрчлөхгүй байх хэрэгтэй. Нэг битийн үнэ цэнийг алдах нь мэдээллийг сэргээх боломжгүй болгодог.

Ажил дууссаны дараа хэрэгсэл нь задлахад шаардлагатай бүх мэдээлэл, түүний дотор ашигласан зургийн талаархи мэдээллийг агуулсан тусгай архивын файлыг үлдээдэг. Энэ нь өөрөө хэдэн килобайт жинтэй бөгөөд эзэлсэн дискний зайд ямар ч нөлөө үзүүлэхгүй.

Та '-a' тугийг ашиглан боломжит хүчин чадлыг шинжлэх боломжтой: './f5ar -a [хайлтын хавтас] [Perl-тай нийцтэй тогтмол илэрхийлэл]'. Баглаа боодол нь './f5ar -p [хайлтын хавтас] [Perl-тай нийцтэй ердийн илэрхийлэл] [савласан файл] [архивын нэр]' командын тусламжтайгаар хийгдэж, './f5ar -u [архивын файл] [сэргээгдсэн файлын нэрээр задална. ]' .

Ажлын үзүүлэн

Аргын үр нөлөөг харуулахын тулд би үйлчилгээнээс нохойн 225 үнэгүй зургийн цуглуулгыг байршуулсан. Unsplash мөн баримт бичгүүдээс хоёр дахь ботийн 45 метр хэмжээтэй том pdf-г олжээ Програмчлалын урлаг Кнута.

Дараалал нь маш энгийн:

$ 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/

Фэнүүдэд зориулсан дэлгэцийн агшин

Хатуу дискний зай хэмнэх хачирхалтай аргын тухай

Савласан файлыг унших боломжтой бөгөөд унших ёстой:

Хатуу дискний зай хэмнэх хачирхалтай аргын тухай

Таны харж байгаагаар хатуу диск дээрх анхны 633 + 36 == 669 мегабайт өгөгдлөөс бид 551-д илүү тааламжтай болсон. Ийм эрс ялгаа нь коэффициентийн утгын бууралттай холбон тайлбарлаж байгаа бөгөөд энэ нь тэдгээрийн коэффициентэд нөлөөлдөг. дараагийн алдагдалгүй шахалт: нэг нэгээр нь багасгах нь эцсийн файлаас хэдэн байтыг хялбархан таслах боломжтой. Гэсэн хэдий ч энэ нь маш бага ч гэсэн өгөгдлийн алдагдал хэвээр байгаа тул та үүнийг тэвчих хэрэгтэй болно.

Аз болоход тэд нүдэнд үл үзэгдэх юм. Спойлерын дор (хабрасатор нь том файлуудыг зохицуулах боломжгүй тул) уншигч өөрчлөгдсөн бүрэлдэхүүн хэсгийн утгыг эх хувилбараас хасах замаар олж авсан нүд болон тэдгээрийн эрчмийн ялгааг үнэлэх боломжтой. эх хувь, доторх мэдээлэлтэй, ялгаа (өнгө нь бүдэгрэх тусам блок дахь ялгаа бага байх болно).

Оронд дүгнэлтийг

Эдгээр бүх бэрхшээлийг харгалзан үзэхэд хатуу диск худалдаж авах эсвэл бүх зүйлийг үүлэн дээр байршуулах нь асуудлыг шийдэх илүү хялбар шийдэл мэт санагдаж магадгүй юм. Гэхдээ бид одоо ийм гайхалтай цаг үед амьдарч байгаа ч маргааш интернетэд холбогдож, бүх нэмэлт мэдээллээ хаа нэгтээ байршуулах боломжтой гэсэн баталгаа байхгүй. Эсвэл дэлгүүрт очоод өөр нэг мянган терабайт хатуу диск худалдаж аваарай. Гэхдээ та одоо байгаа байшингуудыг үргэлж ашиглаж болно.

-> GitHub

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх