ArchiveMount'a daha hızlı bir alternatif?


15

Şu anda ArchiveMountiçinde 3 milyondan fazla dosya içeren 123.000 kb'lik bir arşiv oluşturmak için kullanıyorum . Şimdiye kadar 5 saatten fazla sürüyor ve hala bitmedi.

.tar.gzDosya kurmanın daha iyi bir yolu var mı ? Bir klasöre bağlanmaya çalışıyorum ve sıkıştırılmamış birkaç konser gerekiyor. Yazma moduna bile ihtiyacım yok, sadece salt okunur yeterli.


Ayrıca AVFS var ; Daha iyi performans göstereceği konusunda hiçbir fikrim yok.
Gilles 'SO- kötü olmayı bırak'

8
Dosyalarınız tarball yerine bir squashfs modülü olarak sıkıştırılmışsa, salt okunur erişim çok hızlı olurdu - squashfs modülünü takmanız yeterlidir. Squashfs-tools paketini gerektirir.
dru8274

Şu anda böyle bir dosya sistemini programlıyorum. Birkaç ay bekleyin ve orada olacak.
FUZxxl

@FUZxxl 2 yıl geçti, bu programı hiç yazdınız mı?
cybernard

@ cybernard FUSE beni bu kadar hayal kırıklığına uğrattı ve bu projeden vazgeçtim. Belgesiz bok parçasından nefret ediyorum. Bunu arka brülörde tutuyorum ve daha sonra geri alabilirim.
FUZxxl

Yanıtlar:


7

Sıkıştırılmış bir squashfs görüntüsü de oluşturabilirsiniz

mksquashfs /etc squashfs.img -comp xz
mkdir img
mount -o squashfs,ro squashfs.img img

Bunu yapmak için tar.gz archvie'nizi çıkarmanız gerekir.

Avantajı, görüntünün gz'den daha iyi hata toleransına sahip olmasıdır.


6

Buradaki sorun biçimdedir, TAR (Tape ARchive) biçimi rasgele erişim için değil sıralı erişim için tasarlanmıştır. Ve gzip, tar için iyi bir tamamlayıcıdır, çünkü akış tabanlı bir sıkıştırma formatıdır, rastgele erişim için de değildir.

Bu nedenle, sıkıştırılmış bloklarla doğrudan etkileşime girmeyen yüksek seviyeli bir araç, her şeyi okumak gerektiğinde tüm dosyayı ayrıştırmak zorunda kalacaktır, önce dosya listesini almak için, belki de önbellek geçersiz kılar ve tekrar okur. ve kopyaladığınız her dosya için dosyayı yeniden okuyabilir. Sen olabilir her dosya ve hangi blok onu almak için decompress ihtiyacı konumunu hatırlar bir araç yapmak, ancak birkaç bununla rahatsız gibi görünüyor.

Bunun daha hızlı gitmesini istiyorsanız, bir tar tzf file.tar.gz > filelistdosya yapın, o dosya listesini vim , gedit veya başka bir şekilde açın, ihtiyacınız olmayan dosya satırlarını kaldırın, kaydedin ve sonra bunları ayıklayın tar xzf file.tar.gz -T filelist -C extracted/.

Sıkıştırılmış bir dosyaya rasgele erişim elde etmek için, posix uzantıları, rar veya dru8274'ün önerdiği gibi, squashfs veya sıkıştırma açıkken ZFS veya btrfs okuma sırasında sıkıştırmayı çalıştırdıysa btrfs ile zip kullanmalısınız.


3
Sıkıştırılmış bir dosyaya rastgele erişim elde etmek için pixz de kullanabilirsiniz.
kubanczyk

6

Daha hızlı bir alternatif ratarmount yazdım , "benim için çalışıyor", çünkü bu sorun beni rahatsız ediyordu .

Bu şekilde kullanabilirsiniz:

pip3 install --user ratarmount
ratarmount my-huge-tar.tar mount-folder
ls -la mount-folder # will show the contents of the tar top-level

İşiniz bittiğinde herhangi bir FUSE montajı gibi bağlantısını kesebilirsiniz:

fusermount -u mount-folder

Neden arşivden daha hızlı?

Neyi ölçtüğünüze bağlı.

Burada, basit bir cat <file-in-tar>komut ve basit bir komut için erişim sürelerinin yanı sıra, bellek ayak izi ve ilk montaj için gereken zamanın bir karşılaştırması yer almaktadır find.

Ratarmount ve archivemount arasındaki karşılaştırma karşılaştırması

Her 1k dosyasını içeren klasörler oluşturuldu ve klasör sayısı değişti.

Sol alt grafik, cat <file>rastgele seçilen 10 dosya için minimum ve maksimum ölçülen süreleri gösteren hata çubuklarını gösterir .

Dosya arama süresi

Katil karşılaştırması cat <file>bitirmek için gereken süredir . Bazı nedenlerden dolayı, bu ratarmountta sabit süre kalırken TAR dosya boyutu (dosya başına yaklaşık bayt x dosya sayısı) ile doğrusal olarak ölçeklenir. Bu, archivemount'un aramayı hiç desteklemediğini bile gösteriyor.

Sıkıştırılmış TAR dosyaları için bu özellikle dikkat çekicidir. cat <file>.tar.bz2 dosyasının tamamı iki kattan daha uzun sürüyor! Örneğin, 10k boş (!) Dosyaları içeren TAR arşivleme sayısı ile bağlanmak için 2,9s alır, ancak erişilen dosyaya bağlı olarak, erişim 3ms ile cat5s arasında sürer. Bu sürenin dosyanın TAR içindeki konumuna bağlı olduğu görülüyor. TAR sonunda bulunan dosyaların aranması daha uzun sürer; "arama" öğesinin taklit edildiğini ve dosya okunmadan önce TAR'deki tüm içeriğin bulunduğunu belirtir.

Dosya içeriğini almanın, TAR'ın tamamını takmak beklenmedik iki kattan fazla zaman alabilir. En azından, montaj ile aynı sürede bitmelidir. Bir açıklama, dosyanın taklit edilerek bir kereden fazla, belki de üç kez aranmasıdır.

Ratarmount, gerçek aramayı desteklediği için bir dosyayı almak her zaman aynı miktarda zaman alır. Bzip2 sıkıştırılmış TAR'ler için, adresleri dizin dosyasında da saklanan bzip2 bloğunu bile arar. Teorik olarak, dosya sayısıyla ölçeklendirilmesi gereken tek bölüm dizindeki aramadır ve dosya yoluna ve adına göre sıralandığından O (log (n)) ile ölçeklendirilmelidir.

Bellek alanı

Genel olarak, TAR içinde 20 bin'den fazla dosyanız varsa, dizin oluşturulduğu gibi diske yazıldığından ve sistemimde yaklaşık 30 MB'lık sabit bir bellek alanına sahip olduğundan ratarmount'un bellek alanı daha küçük olacaktır.

Küçük bir istisna, gzip kod çözücü arka ucudur, gzip büyüdükçe bazı nedenlerden dolayı daha fazla bellek gerektirir. Bu bellek yükü, TAR içinde arama yapmak için gerekli olan dizin olabilir, ancak bu arka ucu yazmadığım için daha fazla araştırmaya ihtiyaç vardır.

Aksine, archivemount, örneğin, 2M dosyaları için 4 GB olan tüm dizini TAR monte edildiği sürece tamamen bellekte tutar.

Montaj süresi

En sevdiğim özellik, daha sonraki bir denemede belirgin bir şekilde gecikmeden TAR'ı monte edebilmek için ratarmount. Bunun nedeni, dosya adlarını meta verilere ve TAR içindeki konumla eşleyen dizinin, TAR dosyasının yanında oluşturulan bir dizin dosyasına yazılmasıdır.

Montaj için gereken süre, bir miktar garip davranır. Yaklaşık 20 bin dosyadan başlayarak, dosya sayısına göre doğrusal olarak değil, karesel olarak ölçeklenmeye başlar. Bu, kabaca 4M dosyalardan başlayarak, daha küçük TAR dosyaları için 10 kat daha yavaş olmasına rağmen, ratarmount'un archivemount'tan çok daha hızlı olmaya başladığı anlamına gelir! Daha sonra, daha küçük dosyalar için, katranı (ilk kez) monte etmenin 1s mi yoksa 0.1s mi süreceği önemli değildir.

Bz2 sıkıştırılmış dosyalar için montaj süreleri her zaman en karşılaştırılabilir. Bu çok olasıdır çünkü bz2 kod çözücüsünün hızına bağlıdır. Ratarmount burada yaklaşık 2 kat daha yavaştır. Yakın gelecekte bz2 kod çözücüyü paralelleştirerek ratarmount'u açık kazanan yapmayı umuyorum, bu da 8 yaşındaki sistemim için bile 4x hız sağlayabilir.

Meta veri alma zamanı

findTAR'ın içindeki tüm dosyaları listelerken (bul ayrıca her dosya için stat çağrısında bulunuyor gibi görünüyor !?), ratarmount test edilen tüm durumlar için archivemount değerinden 10 kat daha yavaştır. Gelecekte bunu iyileştirmeyi umuyorum. Ancak şu anda, saf bir C programı yerine Python ve SQLite kullanımı nedeniyle bir tasarım problemine benziyor.


OP problemlerini çözmek için bunu nasıl kuracak ve kullanacak ?
Jeff Schaller

@JeffSchaller github readme.md'den yükleme talimatlarını ekledim
mxmlnkn

0

Bu, metin düzenleyiciyle kullanımı kısıtladığı için tüm kullanım durumlarını kapsamaz. Ancak, yalnızca okuma erişimini önemsiyorsanız, bunu bazı durumlar için yararlı bulabilirsiniz. vim, bir tarball üzerinde çalıştırıldığında size arşivin içerik hiyerarşisini gösterecektir (bir dizinde çalıştırıldığında dosya hiyerarşisini nasıl görüntüleyeceğine benzer). Listedeki dosyalardan birini seçerek, seçilen dosyayı salt okunur bir arabellekte açar.

Yine, bu mutlaka görüntülere veya diğer ortamlara erişim sunmaz, ancak ihtiyacınız olan tek şey içeriği görmek veya yalnızca metin tabanlı dosyalara erişmekse, bu yardımcı olacaktır.

Not : Bu, tüm arşiv formatlarında çalışmaz.


vim'in yerleşik arşiv görüntüleyicisinin avfs ve archivemount'dan çok daha hızlı bir liste elde etmek için tüm dosyayı taraması gerekir. milyonlarca satırın bu kadar büyük bir listesini görüntülemek de korkunç.

0

Benim yaklaşımım. Harici bir USB sürücüde veya yeterli alana sahip harici / ikincil HDD sürücüde yeterli boş disk alanınız varsa, yalnızca .tar.gz dosyanızı ayıklamayı düşünün. Muhtemelen ana sistem diskinizde 3 milyon dosya istemediğinizi düşünmek, işleri yavaşlatabilir. Bu durumda harici diskin çok sayıda dosyayı kolayca işleyen bir dosya sistemine sahip olmasını öneririm: düşünme ReiserFS, ext4 (dir_index seçeneği ile), XFS, belki BtrFS. Ekstraktı yapmak 1-2 saat sürebilir, ancak bu arada öğle yemeğine gidebilir veya gece boyunca çalışmasına izin verebilirsiniz; geri döndüğünüzde, ayıklanan dosyalara erişilmeli.


ek bir ortama gerek yoktur, bir döngü cihazı yeterlidir.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.