Alternatif lebih cepat daripada ArchiveMount?

15

Saat ini saya menggunakan ArchiveMountuntuk me-mount arsip 123.000 kb yang berisi lebih dari 3 juta file di dalamnya. Sejauh ini telah meningkat selama 5+ jam dan masih belum selesai.

Apakah ada cara yang lebih baik untuk me-mount .tar.gzfile? Saya mencoba untuk me-mount ke folder, dan tidak terkompresi dibutuhkan beberapa pertunjukan. Saya bahkan tidak perlu mode tulis, cukup baca saja sudah cukup.

pengguna511046
sumber
Ada juga AVFS ; Saya tidak tahu apakah ini akan berkinerja lebih baik.
Gilles 'SO- stop being evil'
8
Jika file Anda dikompresi sebagai modul squashfs bukan sebagai tarball, maka akses read-only akan sangat cepat - Anda hanya (loop) me-mount modul squashfs. Memerlukan paket squashfs-tools.
dru8274
Saat ini saya sedang memprogram sistem file seperti itu. Tunggu beberapa bulan dan itu akan ada di sana.
FUZxxl
@ FuZxxl Nah, sudah 2 tahun, apakah Anda pernah menulis utilitas ini?
cybernard
@cybernard FUSE membuat saya sangat frustrasi sehingga saya menyerah pada proyek ini. Aku benci omong kosong tak berdokumen ini. Saya menyimpan ini di pembakar belakang dan mungkin membawanya kembali nanti.
FUZxxl

Jawaban:

7

Anda juga bisa membuat gambar squashfs terkompresi

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

Untuk melakukan ini, Anda perlu mengekstrak tar.gz archvie Anda.

Keuntungannya juga bahwa gambar memiliki toleransi kesalahan yang lebih baik daripada gz.


sumber
6

Saya menulis ratarmount alternatif yang lebih cepat , yang "bekerja untuk saya", karena masalah ini terus mengganggu saya.

Anda bisa menggunakannya seperti ini:

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

Setelah selesai, Anda dapat melepasnya seperti pemasangan FUSE:

fusermount -u mount-folder

Mengapa lebih cepat dari jumlah arsip?

Itu tergantung pada apa yang Anda ukur.

Berikut adalah patokan jejak memori dan waktu yang diperlukan untuk pemasangan pertama, serta waktu akses untuk cat <file-in-tar>perintah sederhana dan findperintah sederhana .

Perbandingan benchmark antara ratarmount dan archivemount

Folder yang berisi setiap file 1k dibuat dan jumlah folder bervariasi.

Plot kiri bawah menunjukkan bilah kesalahan yang menunjukkan waktu pengukuran minimum dan maksimum cat <file>untuk 10 file yang dipilih secara acak.

Waktu pencarian file

Perbandingan pembunuh adalah waktu yang dibutuhkan untuk cat <file>menyelesaikannya. Untuk beberapa alasan, ini menskala secara linear dengan ukuran file TAR (kira-kira byte per file x jumlah file) untuk archivemount sementara menjadi waktu yang konstan dalam ratarmount. Ini membuatnya tampak seperti archivemount bahkan tidak mendukung pencarian sama sekali.

Untuk file TAR terkompresi, ini terutama terlihat. cat <file>membutuhkan waktu lebih dari dua kali selama pemasangan seluruh file .tar.bz2! Sebagai contoh, TAR dengan 10k file kosong (!) Membutuhkan 2.9s untuk di-mount dengan archivemount tetapi tergantung pada file yang diakses, akses dengan catmembutuhkan antara 3ms dan 5s. Waktu yang dibutuhkan tampaknya tergantung pada posisi file di dalam TAR. File di akhir TAR membutuhkan waktu lebih lama untuk dicari; menunjukkan bahwa "mencari" ditiru dan semua konten dalam TAR sebelum file dibaca.

Bahwa mendapatkan konten file dapat memakan waktu lebih dari dua kali lipat dari pemasangan seluruh TAR tidak terduga dalam dirinya sendiri. Paling tidak, itu harus selesai dalam jumlah waktu yang sama dengan pemasangan. Salah satu penjelasannya adalah bahwa file sedang ditiru secara dicari untuk lebih dari sekali, bahkan mungkin tiga kali.

Ratarmount tampaknya selalu membutuhkan jumlah waktu yang sama untuk mendapatkan file karena mendukung pencarian yang sebenarnya. Untuk TAR terkompresi bzip2, bahkan mencari blok bzip2, yang alamatnya juga disimpan dalam file indeks. Secara teoritis, satu-satunya bagian yang harus skala dengan jumlah file adalah pencarian dalam indeks dan yang harus skala dengan O (log (n)) karena diurutkan berdasarkan jalur dan nama file.

Jejak memori

Secara umum, jika Anda memiliki lebih dari 20k file di dalam TAR, maka jejak memori ratarmount akan lebih kecil karena indeks ditulis ke disk saat dibuat dan karenanya memiliki jejak memori konstan sekitar 30MB pada sistem saya.

Pengecualian kecil adalah backend gzip decoder, yang karena beberapa alasan memerlukan lebih banyak memori karena gzip semakin besar. Memori overhead ini mungkin merupakan indeks yang diperlukan untuk mencari di dalam TAR tetapi penyelidikan lebih lanjut diperlukan karena saya tidak menulis backend itu.

Sebaliknya, archivemount menyimpan seluruh indeks, yaitu, misalnya, 4GB untuk file 2M, sepenuhnya dalam memori selama TAR dipasang.

Waktu pemasangan

Fitur favorit saya adalah ratarmount untuk dapat memasang TAR tanpa terasa menunda pada percobaan berikutnya. Ini karena indeks, yang memetakan nama file ke metadata dan posisi di dalam TAR, ditulis ke file indeks yang dibuat di sebelah file TAR.

Waktu yang diperlukan untuk pemasangan berperilaku agak aneh di archivemount. Mulai dari kira-kira 20k file mulai skala secara kuadratik bukan linier sehubungan dengan jumlah file. Ini berarti bahwa mulai dari kira-kira file 4M, ratarmount mulai jauh lebih cepat daripada archivemount walaupun untuk file TAR yang lebih kecil itu hingga 10 kali lebih lambat! Kemudian lagi, untuk file yang lebih kecil, tidak masalah apakah dibutuhkan 1s atau 0,1s untuk me-mount tar (pertama kali).

Waktu pemasangan untuk file terkompresi bz2 adalah yang paling sebanding setiap saat. Ini sangat mungkin karena diikat oleh kecepatan decoder bz2. Ratarmount kira-kira 2x lebih lambat di sini. Saya berharap menjadikan ratarmount pemenang yang jelas dengan memparalelkan bz2 decoder dalam waktu dekat, yang bahkan untuk sistem saya yang berusia 8 tahun dapat menghasilkan speedup 4x.

Saatnya mendapatkan metadata

Ketika hanya mendaftarkan semua file dengan finddi dalam TAR (cari juga tampaknya memanggil stat untuk setiap file !?), ratarmount adalah 10x lebih lambat dari archivemount untuk semua kasus yang diuji. Saya berharap untuk memperbaiki ini di masa depan. Tapi saat ini, sepertinya masalah desain karena menggunakan Python dan SQLite daripada program C murni.

mxmlnkn
sumber
Bagaimana OP menginstal dan menggunakan ini untuk memecahkan masalah mereka?
Jeff Schaller
@JeffSchaller Saya menambahkan instruksi instalasi dari readme.md github
mxmlnkn
5

Masalahnya di sini adalah dengan format, format TAR (Tape ARchive) dirancang untuk akses berurutan, bukan akses acak. Dan gzip adalah pelengkap yang baik untuk tar, karena itu adalah format kompresi berbasis aliran, juga bukan untuk akses acak.

Jadi alat tingkat tinggi yang tidak berinteraksi dengan blok terkompresi secara langsung, harus mem-parsing seluruh file setiap kali perlu membaca apa pun, pertama untuk membuat Anda daftar file, maka mungkin cache tidak valid dan membacanya lagi , dan kemudian untuk setiap file yang Anda salin mungkin membacanya lagi. Anda dapat membuat alat yang mengingat posisi setiap file, dan blok apa yang perlu di-dekompres untuk mendapatkannya, tetapi tampaknya hanya sedikit yang peduli dengan hal itu.

Jika Anda ingin ini berjalan lebih cepat, lakukan a tar tzf file.tar.gz > filelist, buka daftar file itu di vim , gedit atau apa pun, hapus baris file yang tidak Anda butuhkan, simpan, dan ekstrak dengan tar xzf file.tar.gz -T filelist -C extracted/.

Untuk mendapatkan akses acak ke file terkompresi, Anda harus menggunakan mungkin zip dengan ekstensi posix, rar, atau seperti yang disarankan dru8274, squashfs, atau bahkan ZFS dengan kompresi dihidupkan, atau btrfs jika btrfs mendapatkan kompresi untuk bekerja pada saat membaca.

beku
sumber
3
Untuk mendapatkan akses acak ke file terkompresi, Anda juga bisa menggunakan pixz.
kubanczyk
0

Ini tidak akan mencakup semua kasus penggunaan karena membatasi digunakan untuk editor teks. Tetapi, jika Anda hanya peduli dengan akses baca, Anda mungkin menemukan ini berguna untuk beberapa situasi. vim, ketika dijalankan pada tarball akan menunjukkan kepada Anda hierarki konten arsip (mirip dengan bagaimana itu akan menampilkan hirarki file jika dijalankan pada direktori). Dengan memilih salah satu file dalam daftar, itu akan membuka file yang dipilih dalam buffer read-only.

Sekali lagi, ini tidak selalu menawarkan akses ke gambar atau media lain, tetapi jika semua yang Anda butuhkan adalah melihat konten atau mengakses file berbasis teks saja, maka ini akan sangat membantu.

Catatan : ini tidak akan berfungsi pada semua format arsip.

HalosGhost
sumber
Penampil arsip bawaan vim masih perlu memindai seluruh file untuk mendapatkan daftar, hampir tidak lebih cepat daripada rata-rata dan arsip. dan menampilkan daftar jutaan baris yang begitu besar juga mengerikan.
把 友情 留 在 无 盐
0

Pendekatan saya Jika Anda memiliki cukup ruang disk kosong pada drive USB eksternal atau drive HDD eksternal / sekunder dengan ruang yang cukup, maka pertimbangkan untuk mengekstrak file .tar.gz Anda. Berpikir Anda mungkin tidak ingin 3 juta file pada disk sistem utama Anda, karena itu bisa memperlambat segalanya. Saya akan merekomendasikan bahwa disk eksternal dalam kasus ini memiliki sistem file yang menangani sejumlah besar file dengan mudah: berpikir ReiserFS, ext4 (dengan opsi dir_index), XFS, mungkin BtrFS. Mungkin butuh 1-2 jam untuk melakukan ekstrak, tetapi Anda bisa pergi makan siang sementara itu atau membiarkannya berjalan semalam; ketika Anda kembali, mengakses file yang diekstraksi harus berkinerja baik.

Joshua Huber
sumber
tidak perlu media tambahan, perangkat loop sudah cukup.
把 友情 留 在 无 盐