Hyperspace: Dosya silmeden disk alanı kazandıran Mac uygulaması
(hypercritical.co)- Mac’te yinelenen dosya temizliği genellikle silmeyi varsayar; Hyperspace ise APFS klonları ile aynı içeriğe sahip dosyaların veriyi paylaşmasını sağlayarak dosyaları yerinde bırakırken alanı geri kazandırır
- APFS’in copy-on-write klonları, Finder’daki “Duplicate” gibi gerçek veriyi yeniden yazmadan veriyi asıl dosyayla paylaşır; büyük dosya kopyaları bile neredeyse anında tamamlanır
- Geliştirici, diski dolmaya başlayınca aynı içeriğe sahip olup klon olmayan dosyaları bulan bir Perl betiği yazdı; tasarruf edilebilecek alanın onlarca GB olduğu görülünce bu betik bir uygulamaya dönüştü
- Uygulama ücretsiz indirilebilir, tarama yapıp tasarruf edilebilecek alanı gösterebilir; ancak gerçek alan geri kazanımı için ücretli ödeme gerekir
- Kendi oluşturmadığı veya sahip olmadığı dosyaları değiştirdiği için risklidir; buna karşın birçok Mac kullanıcısına somut fayda sağlayabilir
APFS klonlarıyla dosyaları yerinde bırakarak alan geri kazanımı
- Hyperspace, aynı içeriğe sahip dosyalar birbirleriyle klon ilişkisi içinde değilse, bunları APFS klonlarına dönüştürerek diskte verinin yalnızca tek bir kopyasının paylaşılmasını sağlar
- Mevcut Mac yinelenen dosya uygulamaları genellikle yinelenen dosyaları bulup silerek alan kazandırır; Hyperspace ise dosyaları kaldırmadan alanı geri kazanır
- APFS’in temel özellikleri arasında belirli an yedekleri (snapshot) ve copy-on-write klonları bulunur
- Snapshot’lar, Time Machine yedeklerini daha güvenilir ve verimli hâle getirmek için kullanılır
- Copy-on-write klonları, dizin girdileri ile dosya içeriği arasındaki esnek yapıya dayanır
- Finder’da “Duplicate” komutuyla bir dosyayı çoğalttığınızda gerçek dosya içeriği kopyalanmaz; bunun yerine veriyi asıl dosyayla paylaşan bir klon dosya oluşturulur
- Bu yapı sayesinde Finder’daki çoğaltma, dosya boyutundan bağımsız olarak neredeyse anında tamamlanır
Yayınlanma biçimi ve geliştirme notları
- Geliştirici, 2024 sonlarında kendi Mac diski dolmaya başlayınca, aynı içeriğe sahip klon olmayan dosyaları bulup klona dönüştüren bir Perl betiği yazdı
- Bu betik, C ile yazılmış bir komut satırı aracını ve Swift ile yazılmış bir komut satırı aracını çağırıyordu
- Çalıştırma sonucunda tasarruf edilebilecek alanın onlarca GB olduğu görüldü ve daha sonra bir Mac uygulamasına dönüştü
- Hyperspace Mac App Store’da sunuluyor
- İndirme ve tarama ücretsizdir
- Gerçek alan geri kazanımı için uygulama içi ödeme gerekir
- Ayrıntılı açıklama Hyperspace documentation sayfasında bulunabilir
- Geliştirme açısından Hyperspace, geliştiricinin ikinci SwiftUI Mac uygulaması ve SwiftUI life cycle kullandığı ilk uygulamadır
- Aynı zamanda Swift 6 kullandığı ikinci uygulamadır
- Geliştirme başlangıcından itibaren Swift 6 kullanmak, hâlihazırda yayımlanmış bir uygulamayı Swift 6’ya taşımaktan çok daha kolaydı
- Swift 6’da hâlâ pek çok pürüzlü nokta var; gelecekte iyileştirmeler bekleniyor
- Hyperspace, HFS+’tan APFS’e dönüştürme sürecine benzer şekilde, uygulamanın oluşturmadığı ve sahip olmadığı dosyaları değiştirir
- Geliştirici bunu, yaptığı uygulamalar arasında en riskli uygulama olarak nitelendiriyor
- Aynı zamanda en çok kişiye faydalı olabilecek uygulama olabileceğini düşünüyor
1 yorum
Hacker News yorumları
Eskiden aynı işi yapan
dedupadlı bir komut satırı aracı yazmıştımDry-run modu var; “akıllıca” en iyi klon kaynağını seçiyor, hard link’leri ve diğer klonları anlıyor, metadata’yı koruyor ve HFS sıkıştırılmış dosyaları da düzgün işliyor
Kendi verilerimi henüz hiç bozmadı ama dosya sistemi araçlarında her zaman olduğu gibi kullanım sorumluluğu size ait
0 - https://github.com/ttkb-oss/dedup
Hyperspace varsayılan olarak tüm dosyaları taramıyor, yalnızca izin verilenler listesindeki dosyalara bakıyor ve dosya içeriğini anlaması gereken bir yapıda görünüyor. Son kullanıcı olarak Text dosyaları ile Source Code dosyaları arasındaki farkı nasıl ayırt ettiğini bilmiyorum; varsayılan tarama yalnızca 360 MB’ı tekilleştirme adayı olarak buldu, ama tüm dosyalara izin verince bu 842 MB’a çıktı
Varsayılan olarak 100 KB altındaki dosyaları da taramıyor; boyut sınırını kapatıp tüm dosyalara izin verince 1,1 GB’a kadar çıktı. Tüm dosyalar ve boyut sınırı yok koşulunda Hyperspace 68.874 dosyanın 67.309’unu taradı,
dedupise 67.426 dosyayı taradıHyperspace 29.522 dosyanın tekilleştirilebilir olduğunu söyledi,
dedupise 29.447 dosya buldu. Zaten tekilleştirilmiş 76 dosya olduğu için bir fark oluşuyor ama tam nedeni bilmiyorumTarama süresi Hyperspace için yaklaşık 50 saniye,
dedupiçin 14 saniyeydi. Hyperspace dosya sistemini taradıktan sonra tekrarları hesaplayıp ardından tekilleştirme yapıyor gibi görünüyor; ilk iki adımı neden birlikte yapmadığını bilmiyorum. Ben tarama sırasında dosya sistemi metadata’sını kuyruğa alıp paralel olarak tekrar hesaplamasını başlatacak şekilde yaptım; çoğu durumda uyuşmazlıkları elemek içinfts_readile dizinleri dolaşırken “bedavaya” elde edilen boyut bilgisi yeterli oluyorHyperspace 1,1 GB tasarruf edilebileceğini söyledi;
dedupise 1,04 GB ve zaten tasarruf edilmiş 882 MB buldu. Hyperspace’i satın almayı düşünmediğim için gerçek tekilleştirme süresini, metadata korumasını veya tuhaf dosyaların işlenmesini bilmiyorum; amadeduptarama ve tekilleştirmeyi birlikte 31 saniyede tamamladıdedupile tekilleştirme yaptıktan sonra bile Hyperscan hâlâ tekilleştirilebilir 2 dosya olduğunu düşündü. Hyperspace de birden fazla hard link’i olan dosyaları, boş dosyaları vededupın kontrol ettiği çeşitli istisnaları işliyor gibi görünüyor. ACL veya diğer özelliklerin korunmasını ödeme yapmadan test edemiyorum amastringsçıktısına bakınca bunları işliyor gibi; HFS sıkıştırma ise zor bir sınır durumu olduğundan Hyperspace taramasının bunu nasıl ele aldığını henüz doğrulayamadımProjede lisans yok; mümkünse tercih ettiğiniz lisansı eklemeniz iyi olur. Kurulum adımlarını biraz iyileştirmek için bir pull request de açtım: https://github.com/ttkb-oss/dedup/pull/6
Yalnızca belirli alt dizinlere bakınca bile bir JS dosyasının 50 kopyasını tek bir dosyaya dönüştürmek nadir değildi. Ancak “pre-release” olduğu ve GitHub yıldızı da nispeten az olduğu için, böyle araçlarda hata olursa oldukça korkutucu olabileceğinden kararlılığını merak ediyorum
makein neredeyse anında bitmesi de etkileyiciydiEskiden https://github.com/sahib/rmlint kullanmıştım, özel bir şikâyetim yoktu
“Hyperspace’in diğer tüm uygulamalarla veya macOS’in kendisiyle işbirliği yapıp dosya değişimi için güvenli anı koordine etmesinin bir yolu yok; ilgili dosyayı zorla tek başına denetlemesinin de bir yolu yok” kısmını görünce, dosya sisteminin kendisinin arka planda benzer bir tekilleştirme süreci neden çalıştırmadığını merak ettim
Bu düzeyde bir soyutlama katmanı bu tür güvenlik sorunlarını yönetebilir gibi geliyor; APFS içinde otomatik olarak gerçekleşse ne gibi dezavantajları olurdu diye düşünüyorum
Dosya düzeyinde uygulanırsa kaynak kullanımı azalabilir, ama uygulamanın daha basit mi daha karmaşık mı olacağından emin değilim. Ayrıca büyük bir dosyada yalnızca 1 bayt değişse bile dosya sisteminin o dosyayı yeniden kopyalaması gerekeceği için çok disk etkinliği oluşması sezgisel gelmeyebilir
Bu katmanda tekilleştirme yapmak, birden çok dosya sistemi genelinde tekilleştirme yapabildiği için iyidir. Örneğin aynı işletim sistemi dosyalarına sahip bin sistem varsa depolama alanında muazzam tasarruf sağlanabilir; farklar çoğu zaman ana makine anahtarı veya ana makine adı gibi sisteme özgü ayarlardan ibaret olur. Tek bir dosya sistemi bu ortaklığı fark edemez
Ancak tekilleştirme yüzünden yoğun kullanılan bir dosyanın kopya sayısı azalırsa sorun olur. Önceki örnekte bin makineyi aynı anda başlatırsanız kernel imajı üzerinde çok büyük I/O yükü oluşabilir
Belirli aralık kümelerini işletim sisteminden kibarca tekilleştirmesini istersiniz; OS aralıkları kilitler, gerçekten aynı olduklarını doğrular ve ancak ondan sonra tekilleştirme yapar. Her aralıkta kaç baytın tekilleştirildiği de bir alan olarak geri döndüğünden, kullanıcı alanındaki programın dosyayı bozmasının bir yolu yoktur
Hyper-V VM’leri barındıran ReFS üzerinde epey kullandım ve etkisi harikaydı. O dönemde VM’lerin çoğu Windows Server 2016/2019 karışımıydı; depolama kullanımını yaklaşık %45 azalttı
Taramayı ücretsiz yapıp bir kazanç olup olmadığını görmeyi, gerçek sonuçlar için ödeme yapma modelini seviyorum
Ben de dosya biriktirmeye yatkınım, çalıştırdığımda 7 GB geri kazanılabilir dedi; ama benim için bu, para ödemeye değecek kadar değildi. Yine de böyle bir aracın olması güzel
Zaten bir ay içinde yanlışlıkla tamamen aynı yinelenen dosyalardan ne kadar çok oluşturabilirsiniz ki?
Gerçekten sık kullanacak kişiler için abonelik veya kalıcı satın alma seçenekleri de var, ama birçok kişi için sınırlı bir süre kullanılabilen tek seferlik uygulama içi satın alma oldukça makul. Üstelik istediğiniz zaman ücretsiz yeniden çalıştırıp, tekrar ödeme yapmaya değecek kadar birikmiş mi diye bakabilirsiniz
Muazzam miktarlar oluşturmuyorum, ama bir kısmını veya tamamını birleştirince büyük yinelenen dosyalar ortaya çıkabiliyor. Genelde bir sabit disk kurtarma sonucunu başka konumlardaki dosyalarla eşleştirmek ya da dağınık bir İndirilenler klasörünü düzenli bir hedef konumla eşleştirmek gibi tuhaf durumlarda bu oluyor
Örneğin Time Machine yedeği, kayıtlı olduğunu bile bilmediğim ve uzun zaman önce kaybettiğimi sandığım bir dosyanın eski sürümünü ortaya çıkarmıştı; ama dizin adlarını bozmuş ve içeriği de bir ölçüde okunmaz hâle getirmişti. Sayı adlarına sahip binlerce dizin var; içlerinde saklamak isteyeceğim dosyalar olabilir, ama zaten bende var mı, neredeler, hiçbir yapı olmadığı için anlamak zor. Öte yandan çoğu zaman yalnızca aynı build sistemi metin dosyasını içeren dizinler de oluyor; onları elbette atabilirsiniz
İnsanlar abonelik tuzaklarına şimdiden o kadar alıştı ki bu onlara yeni bir model gibi mi geliyor
Keşke başka yazılımlarda da bunu yapmak bu kadar kolay olsa; ama çoğu zaman değeri görmeden önce öğrenme eğrisi araya giriyor
Bir ipucu: Böyle denemelerde kilitlenebilir bir sanal kart kullanırsanız, iptal etmeyi unutsanız bile ödeme engellenir. Bu arada web sitesinde gerçek lisans fiyatını bulabilen oldu mu merak ediyorum
Uygulamanın iki dosyanın aynı olup olmadığını anlamak için hangi algoritmayı kullandığını merak ediyorum
Hash, bit düzeyinde karşılaştırma gibi ilginç birçok yöntem var ama her birinin dezavantajları da var. Çok fazla dosya olduğunda en iyi yöntem nedir acaba
Her aday dosya için, başka bir aday dosyayla aynı olup olmadığını kontrol edecek bir “anahtar” gerekir. Milyonlarca dosya olabileceğinden anahtar küçük ve hızlı üretilir olmalı; aynı zamanda yanlış pozitif olmamalı
Bugün obvious yanıt, dosya içeriğinin SHA256 hash’i. Çok hızlı, 32 baytla boyutu da pek büyük değil; yanlış pozitif veya çakışma olasılığı da pratikte karşılaşmadan dünyanın sonu gelecek kadar düşük. SHA256 bu kullanım için fiilî standart; başka bir şey yaptıysa epey şaşırırım
Hash’i tekilleştirme için kullanan içerik adreslemeli bir dosya sistemiydi; hash yazma anında hesaplandığı için performans maliyeti dağıtılıyordu
Böylece büyük dosyanın tamamını hash’lemek gerekmez; yalnızca aynı hash’e sahip dosyalara ayrıca bakılır
Apple, APFS’in klonlama özelliğini kullanabilmek için
-cbayrağını destekleyen değiştirilmiş bircpkomutu da sağlıyorcpbunu desteklemiyorsa Python ile de çağırabilirsinizÖrneğin
import Foundation; Foundation.NSFileManager.defaultManager().copyItemAtPath_toPath_error_(...)gibiA dosyası iki konumdaysa ve bunu çalıştırdıktan sonra
A_0üzerinde değişiklik yaparsam,A_1de birlikte değişir mi, yoksa yalnızcaA_0ın yeni durumu somutlaşıpA_1olduğu gibi mi kalır merak ediyorumA_0ı değiştirirseniz yazma anında o dosyanın bir kopyasını oluşturur;A_1e dokunmazhttps://en.wikipedia.org/wiki/Copy-on-write#In_computer_stor...
Bu yüzden
A_1olduğu gibi bırakılır veA_0daki değişiklikler için yeni bir kopya oluşturulur. Ayrıntılar için bkz. https://developer.apple.com/documentation/foundation/file_sy...WWDC 2017'de Apple'ın APFS'i duyurmasından önce, iOS 10.x güncellemesinin bir parçası olarak tüm iPhone'ları gizlice APFS'e deneme amaçlı dönüştürüp sonra HFS+'a geri döndürdüğü bölüm dikkatimi çekti
Dosya sistemi değişikliği ters giderse nasıl geri alınabileceğini merak ediyorum. Kodu yeterince doğrulamak mümkün olabilir ama bir sorun çıkarsa geri çekmek imkânsız gibi görünüyor
Apple'ın test geçişinde, APFS superblock'unun oluşturulması dahil tüm migrasyon yapıldı; ancak HFS+ superblock'unun kalıcı olarak APFS superblock'u ile değiştirileceği commit'in hemen öncesinde duruldu. Geri almak için oluşturulan APFS superblock'u ve metadata bloklarını “sadece” temizlemek yeterliydi
Prod ortamda çok şey patlatmış biri olarak, böyle büyük bir migrasyonu çalıştırmam söylense düğmeye basabilir miydim bilmiyorum
[0] https://www.youtube.com/watch?v=IcyaadNy9Jk&t=1670s
Açık kaynak dünyasında da ext dosya sistemini btrfs'e dönüştüren bir araç var; (1) geri alınabiliyor ve (2) btrfs dosya sistemini kullanırken özgün ext dosya sistemi de mount edilebiliyor
Bir hikâyeyle başlayıp sonra soruna daraltıyor, ardından çözümün o sorunu sihirli biçimde çözdüğünü gösteriyor
İyi pazarlamanın çok iyi bir örneği
Devasa bir NodeJS proje klasöründe denedim ama 8,1 GB'lık klasörde yalnızca 1 GB tasarruf edilebileceğini söyledi
Kullanıcı ana klasörünü de dahil ederek tekrar çalıştırdım; 731K dosya, 127K klasör ve 2.755 hedef dosya için toplam tasarruf sadece 1,3 GB oldu. Yalnızca NodeJS klasöründe çalıştırdığıma göre yaklaşık 300 MB daha fazla
System ve Library'yi de taramaya çalıştım ama izin sorunları nedeniyle reddedildi. Paket yöneticisi olarak pnpm kullandığım için disk kullanımım zaten neredeyse optimuma yakın görünüyor
Fikir güzel ama mevcut fiyatıyla haklı çıkarmak zor; ayda bir kez arka plan süreci olarak çalışan bir şey olsa iyi olurdu
https://support.apple.com/guide/security/signed-system-volum...
Karşılaştırma tamponunu küçültmek için eklenmiş gibi; node_modules içindeki dosyaların bu boyutun altında kalıp dikkate alınmamış olma ihtimali var
Aynı içeriğe sahip dosyaları hard linke çeviren benzer ama daha basit bir betik yazmıştım
Asıl motivasyon Python sanal ortamlarındaki paketlerdi. Çoğu zaman benzer paketler kurulu oluyor ve sürümler farklı olsa bile birçok dosya hâlâ aynı kalıyor. Numpy, PyTorch, TensorFlow gibi bazı paketler epey büyük olduğundan disk alanından ciddi tasarruf sağlayabiliyordu
https://github.com/albertz/system-tools/blob/master/bin/merg...
[1] https://en.wikipedia.org/wiki/Apple_File_System#Clones
poetry, hatch, pdm gibi diğer araçlar da muhtemelen yapıyordur ama ayrıntılı davranışlarını çok kullanmadığım için iyi bilmiyorum