Sabit disk alanından tasarruf etmenin garip bir yöntemi hakkında

Başka bir kullanıcı sabit diske yeni bir veri yazmak istiyor ancak bunun için yeterli boş alanı yok. Ayrıca hiçbir şeyi silmek istemiyorum çünkü "her şey çok önemli ve gerekli." Peki bununla ne yapmalıyız?

Kimsede bu sorun yok. Sabit disklerimizde terabaytlarca bilgi var ve bu miktarın azalma eğilimi yok. Ama ne kadar benzersiz? Sonuçta, tüm dosyalar yalnızca belirli uzunluktaki bit kümeleridir ve büyük olasılıkla yenisi, halihazırda depolanmış olandan pek farklı değildir.

Halihazırda sabit diskte depolanan bilgi parçalarını aramanın başarısızlık olmasa da en azından etkili bir görev olmadığı açıktır. Öte yandan, eğer fark küçükse, o zaman biraz ayarlayabilirsiniz...

Sabit disk alanından tasarruf etmenin garip bir yöntemi hakkında

TL;DR - JPEG dosyalarını kullanarak verileri optimize etmenin garip bir yönteminden bahsetmeye yönelik ikinci girişim, şimdi daha anlaşılır bir biçimde.

Bitler ve farklar hakkında

Tamamen rastgele iki veri parçası alırsanız, içerdikleri bitlerin ortalama yarısı çakışır. Aslında, her bir çift için olası düzenlerin ('00, 01, 10, 11') tam yarısı aynı değerlere sahiptir, burada her şey basittir.

Ama tabii ki, eğer sadece iki dosya alıp birini ikinciye sığdırırsak, o zaman bunlardan birini kaybederiz. Değişiklikleri kaydedersek, yeniden keşfedeceğiz delta kodlamasıGenellikle aynı amaçlarla kullanılmasa da, biz olmadan da gayet iyi bir şekilde varlığını sürdürüyor. Daha küçük bir diziyi daha büyük bir diziye yerleştirmeyi deneyebiliriz, ancak yine de onu her şeyde dikkatsizce kullanırsak kritik veri bölümlerini kaybetme riskiyle karşı karşıya kalırız.

Ne ile ne arasındaki fark ortadan kaldırılabilir? Yani, kullanıcı tarafından yazılan yeni bir dosya, tek başına hiçbir şey yapamayacağımız bir dizi bitten ibarettir. O zaman sabit diskte, farkı kaydetmenize gerek kalmadan değiştirilebilecek öyle parçalar bulmanız gerekir ki, ciddi sonuçlara yol açmadan bunların kaybından kurtulabilirsiniz. Ve yalnızca FS'deki dosyayı değil, içindeki daha az hassas bazı bilgileri de değiştirmek mantıklıdır. Ama hangisi ve nasıl?

Montaj yöntemleri

Kayıplı sıkıştırılmış dosyalar kurtarmaya gelir. Tüm bu jpeg'ler, mp3'ler ve diğerleri, kayıplı sıkıştırmaya rağmen, güvenli bir şekilde değiştirilebilecek bir sürü bit içerir. Kodlamanın çeşitli aşamalarında bileşenlerini fark edilmeden değiştiren gelişmiş tekniklerin kullanılması mümkündür. Beklemek. Gelişmiş teknikler... algılanamaz değişiklik... bir parçadan diğerine... neredeyse aynı steganografi!

Gerçekten de, bir bilgiyi diğerine gömmek, onun yöntemlerini başka hiçbir şeye benzemeyen bir şekilde anımsatıyor. Ayrıca insan duyularında yapılan değişikliklerin algılanamazlığından da etkilendim. Yolların ayrıldığı yer gizliliktir: Bizim görevimiz kullanıcının sabit diskine ek bilgiler girmesidir; bu ona yalnızca zarar verir. Yine unutacak.

Bu nedenle bunları kullanabilmemize rağmen bazı değişiklikler yapmamız gerekiyor. Sonra bunları mevcut yöntemlerden birini ve ortak bir dosya formatını kullanarak anlatacağım ve göstereceğim.

Çakallar hakkında

Gerçekten sıkarsanız dünyadaki en sıkıştırılabilir şeydir. Elbette JPEG dosyalarından bahsediyoruz. Verileri içine gömmek için tonlarca araç ve mevcut yöntem bulunmasının yanı sıra, bu gezegendeki en popüler grafik formatıdır.

Sabit disk alanından tasarruf etmenin garip bir yöntemi hakkında

Ancak köpek yetiştiriciliği yapmamak için bu formattaki dosyalarda faaliyet alanınızı sınırlamanız gerekir. Hiç kimse aşırı sıkıştırma nedeniyle ortaya çıkan tek renkli karelerden hoşlanmaz, bu nedenle kendinizi zaten sıkıştırılmış bir dosyayla çalışmakla sınırlamanız gerekir; yeniden kodlamadan kaçınmak. Daha spesifik olarak, veri kaybından sorumlu işlemlerden sonra kalan tamsayı katsayılarıyla - kodlama şemasında mükemmel bir şekilde görüntülenen DCT ve niceleme (Bauman Ulusal Kütüphanesi'nin wiki'si sayesinde):
Sabit disk alanından tasarruf etmenin garip bir yöntemi hakkında

Jpeg dosyalarını optimize etmenin birçok olası yöntemi vardır. Kayıpsız optimizasyon var (jpegtran), optimizasyon var "kayıpsız“Aslında başka bir şeye katkıda bulunanlar ama biz onları umursamıyoruz. Sonuçta, kullanıcı boş disk alanını artırmak için bir bilgiyi diğerine yerleştirmeye hazırsa, o zaman ya görüntülerini uzun zaman önce optimize etmiştir ya da kalite kaybı korkusuyla bunu hiç yapmak istememektedir.

F5

Tüm bir algoritma ailesi, aşina olabileceğiniz bu koşullara uyar bu güzel sunumda. Bunlardan en gelişmişi algoritmadır F5 Andreas Westfeld tarafından, parlaklık bileşeninin katsayıları üzerinde çalışılıyor, çünkü insan gözü bu bileşenlerdeki değişikliklere en az duyarlı olanıdır. Ayrıca, kullanılan kabın boyutu büyüdükçe aynı miktarda bilgiyi gömerken daha az değişiklik yapılmasını mümkün kılan matris kodlamaya dayalı bir gömme tekniği kullanır.

Değişikliklerin kendisi, belirli koşullar altında (yani her zaman değil) katsayıların mutlak değerini birer birer azaltmaktan ibarettir; bu, sabit sürücünüzdeki veri depolamayı optimize etmek için F5'i kullanmanıza olanak tanır. Mesele şu ki, böyle bir değişiklikten sonraki katsayı, JPEG'deki değerlerin istatistiksel dağılımı nedeniyle Huffman kodlamasından sonra büyük olasılıkla daha az bit kaplayacak ve yeni sıfırlar, bunları RLE kullanarak kodlarken bir kazanç sağlayacaktır.

Gerekli değişiklikler, kaynaklardan ve yürütme süresinden tasarruf sağlayan gizlilikten sorumlu kısmın (şifre yeniden düzenlemesi) ortadan kaldırılmasına ve aynı anda bir dosya yerine birçok dosyayla çalışmaya yönelik bir mekanizmanın eklenmesine kadar uzanır. Okuyucunun değişim süreciyle daha ayrıntılı olarak ilgilenmesi pek olası değildir, bu nedenle uygulamanın açıklamasına geçelim.

Yüksek teknolojiler

Bu yaklaşımın nasıl çalıştığını göstermek için, yöntemi saf C'de uyguladım ve hem yürütme hızı hem de bellek açısından bir dizi optimizasyon gerçekleştirdim (bu resimlerin sıkıştırma olmadan ne kadar ağır olduğunu, hatta DCT'den önce bile hayal edemezsiniz). Kitaplıkların bir kombinasyonu kullanılarak elde edilen çapraz platform libjpeg, pcre и minikdirBunun için onlara teşekkür ediyoruz. Bütün bunlar 'make' tarafından bir araya getirilir, bu nedenle Windows kullanıcıları değerlendirme için Cygwin'i kendileri yüklemek veya Visual Studio ve kütüphanelerle kendi başlarına ilgilenmek isterler.

Uygulama, bir konsol yardımcı programı ve kütüphane biçiminde mevcuttur. İlgilenenler ikincisini kullanma hakkında daha fazla bilgiyi yazının sonuna ekleyeceğim bağlantı olan Github'daki depodaki benioku dosyasında bulabilirler.

Nasıl kullanılır?

Dikkatlice. Paketleme için kullanılan görseller, verilen kök dizinde düzenli bir ifade kullanılarak arama yapılarak seçilir. Tamamlandıktan sonra dosyalar kendi sınırları dahilinde istenildiği gibi taşınabilir, yeniden adlandırılabilir ve kopyalanabilir, dosya ve işletim sistemi değiştirilebilir vb. Ancak son derece dikkatli olmalı ve anlık içeriği hiçbir şekilde değiştirmemelisiniz. Bir bitin bile değerini kaybetmek, bilginin kurtarılmasını imkansız hale getirebilir.

Tamamlandığında yardımcı program, kullanılan görüntülerle ilgili veriler de dahil olmak üzere paketin açılması için gerekli tüm bilgileri içeren özel bir arşiv dosyası bırakır. Tek başına yaklaşık birkaç kilobayt ağırlığındadır ve kaplanan disk alanı üzerinde önemli bir etkisi yoktur.

'-a' işaretini kullanarak olası kapasiteyi analiz edebilirsiniz: './f5ar -a [arama klasörü] [Perl uyumlu normal ifade]'. Paketleme './f5ar -p [arama klasörü] [Perl uyumlu normal ifade] [paketlenmiş dosya] [arşiv adı]' komutuyla yapılır ve paketten çıkarma './f5ar -u [arşiv dosyası] [kurtarılan dosya adı] ile yapılır ]' .

İş gösterimi

Yöntemin etkinliğini göstermek için, hizmete ait 225 adet tamamen ücretsiz köpek fotoğrafından oluşan bir koleksiyon yükledim Unsplash ve belgelerde ikinci cildin 45 metrelik büyük bir pdf'i bulundu Programlama Sanatı Knuta.

Sıra oldukça basittir:

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

Hayranlar için ekran görüntüleri

Sabit disk alanından tasarruf etmenin garip bir yöntemi hakkında

Paketten çıkarılan dosya okunabilir ve okunmalıdır:

Sabit disk alanından tasarruf etmenin garip bir yöntemi hakkında

Gördüğünüz gibi sabit diskteki orijinal 633 + 36 == 669 megabayt veriden daha hoş 551'e geldik. Bu kadar radikal bir fark, katsayıların değerlerindeki azalmayla açıklanıyor, bu da onları etkiliyor ardından kayıpsız sıkıştırma: tek tek azaltmak, son dosyadan birkaç baytı kolayca kesebilir. Ancak bu, son derece küçük de olsa, katlanmak zorunda kalacağınız bir veri kaybıdır.

Neyse ki gözle kesinlikle görünmezler. Spoiler altında (habrastorage büyük dosyaları işleyemediğinden), okuyucu, değiştirilen bileşenin değerlerinin orijinalden çıkarılmasıyla elde edilen farkı hem gözle hem de yoğunlukla değerlendirebilir: orijinal, içindeki bilgilerle, fark (renk ne kadar donuk olursa bloktaki fark o kadar küçük olur).

Bunun yerine bir sonuca

Tüm bu zorluklar göz önüne alındığında, bir sabit disk satın almak veya her şeyi buluta yüklemek, soruna çok daha basit bir çözüm gibi görünebilir. Ancak şu anda harika bir zamanda yaşıyor olsak bile, yarın çevrimiçi olup tüm ekstra verilerinizi bir yere yüklemenin hala mümkün olacağının garantisi yok. Veya mağazaya gidin ve kendinize bin terabaytlık bir sabit disk daha satın alın. Ancak her zaman mevcut evleri kullanabilirsiniz.

-> GitHub

Kaynak: habr.com

Yorum ekle