Masalah memori saat mengompresi dan mentransfer sejumlah besar file kecil (total 1TB)

15

Saya memiliki 5 juta file yang memakan sekitar 1TB ruang penyimpanan. Saya perlu mentransfer file-file ini ke pihak ketiga.

Apa cara terbaik untuk melakukan ini? Saya telah mencoba mengurangi ukuran menggunakan .tar.gz, tetapi meskipun komputer saya memiliki RAM 8GB, saya mendapatkan kesalahan "kehabisan memori sistem".

Apakah solusi terbaik untuk mengirim file ke siput?

oshirowanen
sumber
9
Apakah Anda mengalami masalah MENCIPTAKAN .tar.gzatau MENYALIN file terkompresi yang dihasilkan? Either way, ada yang aneh, karena operasi tidak boleh mengkonsumsi lebih banyak memori hanya karena file-file itu besar. Artinya, kedua operasi harus streaming. Harap sertakan informasi lebih lanjut tentang perintah apa yang gagal.
Celada
1
Berapa banyak bandwidth yang Anda dan pihak ketiga miliki? Sebuah rsync yang naif dapat menghemat biaya pengiriman Anda. Tapi saya tidak tahu bagaimana "lima juta" file akan bekerja untuk Anda karena rsync akan mencoba untuk membangun filelist di-memori dan jika bisa daftar (file 5e6)> 8 GB. Dan tentu saja akan lambat.
Kalvin Lee
2
@oshirowanen Saya tidak berpikir itu harus mengkonsumsi banyak memori menghitung daftar file karena saya cukup yakin tarharus mengarsipkan file secara bertahap karena daftar mereka, tidak pernah membangun daftar dalam memori. Tetapi sekali lagi, tolong tunjukkan perintah yang tepat yang Anda gunakan. Juga, apakah semua file dalam direktori yang sama atau apakah struktur direktori sangat dalam?
Celada
3
Ah ya, program GUI yang baik sering dibangun tanpa memberi banyak arti pada tujuan seperti skalabilitas dan ketahanan. Itu tidak akan mengejutkan saya jika itu adalah kesalahan dari GUI wrapper / frontend. Buat file menggunakan baris perintah dan saya pikir Anda akan menemukan bahwa itu berfungsi dengan baik.
Celada
3
1 TB data akan membutuhkan setidaknya 22 jam untuk transfer pada koneksi broadband 100 Mbit / s. Jadi tergantung pada seberapa banyak kompresi yang Anda harapkan untuk dicapai, surat siput mungkin sebenarnya merupakan opsi yang lebih cepat.
Dan

Jawaban:

27

Informasi tambahan yang disediakan dalam komentar mengungkapkan bahwa OP menggunakan metode GUI untuk membuat .tar.gzfile.

Perangkat lunak GUI sering menyertakan lebih banyak mengasapi daripada perangkat lunak setara baris perintah yang setara, atau melakukan tugas tambahan yang tidak perlu demi beberapa fitur "ekstra" seperti bilah kemajuan. Tidak akan mengejutkan saya jika perangkat lunak GUI mencoba mengumpulkan daftar semua nama file dalam memori. Tidak perlu melakukan itu untuk membuat arsip. Alat-alat khusus tardan gzipdirancang untuk bekerja dengan streaming input dan output yang berarti bahwa mereka dapat menangani input dan output yang jauh lebih besar daripada memori.

Jika Anda menghindari program GUI, kemungkinan besar Anda dapat menghasilkan arsip ini menggunakan tardoa sehari-hari yang benar-benar normal seperti ini:

tar czf foo.tar.gz foo

di mana foodirektori yang berisi semua 5 juta file Anda.

Jawaban lain untuk pertanyaan ini memberi Anda beberapa tarperintah alternatif tambahan untuk dicoba jika Anda ingin membagi hasilnya menjadi beberapa bagian, dll ...

Celada
sumber
15

"lima juta" file, dan total 1TB? File Anda pasti sangat kecil. Saya hanya mencoba rsync:

rsync -alPEmivvz /source/dir remote.host.tld:/base/dir

Jika Anda tidak memilikinya - atau case-use Anda tidak memungkinkan untuk digunakan rsync, setidaknya saya akan memeriksa apakah 7zberfungsi dengan data Anda. Mungkin tidak, tapi saya pikir ini masih patut dicoba:

7z a archive.7z /source/dir

Atau jika Anda merasa tidak nyaman dengan 7zsetidaknya mencoba membuat .tar.xzarsip:

tar cJv archive.tar.xz /source/dir

(Perlu dicatat, bahwa versi lama dari tartidak membuat .tar.xzarsip, tetapi .tar.lzmaarsip, ketika menggunakan Jswitch. Bahkan versi yang lebih lama tar, tidak mendukung Jflag sama sekali.)


Karena Anda menggunakan program GUI untuk membuat file-file itu, saya berasumsi Anda merasa sedikit tidak nyaman menggunakan antarmuka baris perintah.

Untuk memfasilitasi pembuatan, pengelolaan, dan ekstraksi arsip dari antarmuka baris perintah, ada utilitas kecil yang disebut atool. Ini tersedia untuk hampir semua distro umum yang pernah saya lihat, dan bekerja hampir setiap arsip yang saya temui, kecuali yang tidak jelas.

Periksa apakah distro Anda ada atooldi repo mereka, atau minta admin Anda untuk menginstalnya, ketika berada di lingkungan tempat kerja.

atool menginstal banyak symlink ke dirinya sendiri, sehingga pengepakan dan pembongkaran menjadi mudah:

apack archive.tar.xz <files and/or directories>

Membuat arsip.

aunpack archive.7z

Perluas arsip.

als archive.rar

Daftar isi file.

Jenis arsip apa yang dibuat, atoolmembedakannya dengan ekstensi nama file arsip Anda di baris perintah.

polemon
sumber
4
Keuntungan menggunakan di sini rsyncadalah bahwa jika koneksi terputus, rsyncbisa mengambilnya dari tempat sebelumnya.
roaima
2
File akan menjadi rata-rata 200 KB. Itu tidak terlalu kecil.
Nate Eldredge
4
@NateEldredge Saya biasanya menganggap sebesar makna> 1GB. Kecil biasanya <1MB. Sangat kecil.
PythonNut
8

Kecuali jika Anda dapat melakukan kompresi lebih baik dari 25: 1, Anda tidak akan memperoleh apa pun dari mengompresi ini sebelum mengirim siput, kecuali jika Anda memiliki beberapa format kaset perangkat keras yang dapat Anda tukarkan dengan pihak ketiga.

Penyimpanan umum terbesar adalah sinar biru dan kira-kira Anda mendapat 40Gb. Anda membutuhkan kompresi 25 hingga 1 pada data Anda agar sesuai dengan itu. Jika pihak ketiga Anda hanya memiliki DVD, Anda memerlukan 125: 1 (kurang-lebih).

Jika Anda tidak dapat mencocokkan angka-angka kompresi itu hanya menggunakan disk biasa, salin dan kirim surat itu ke pihak ketiga. Dalam hal pengiriman sesuatu yang lebih kecil dari drive 1TB yang perlu kompresi adalah kegilaan.

Anda hanya perlu membandingkannya dengan menggunakan ssh -C(kompresi standar) atau lebih disukai rsyncdengan kompresi untuk menyalin file melalui jaringan, tidak perlu mengompres dan tar di muka. 1Tb bukan tidak mungkin untuk bergerak melewati net, tetapi akan memakan waktu cukup lama.

Anthon
sumber
5
+1: "jangan pernah meremehkan lebar pita station wagon yang penuh dengan kaset yang meluncur di jalan raya" (Andrew S. Tanenbaum). lihat en.wikipedia.org/wiki/Sneakernet
Olivier Dulac
@OlivierDulac Saya telah melihat konstruksi yang sama dengan Boeing 747 dan kotak-kotak yang penuh dengan CDROM, sungguh menakjubkan jenis throughput yang bisa Anda dapatkan dengan itu.
Anthon
Saya suka bahwa pidgin mengalahkan ISP lama, lihat contoh halaman wikipedia ^^
Olivier Dulac
6

Apakah Anda mempertimbangkan torrent? Peer-to-Peer mungkin menjadi pilihan terbaik Anda untuk transfer over-the-internet:

  • Paling tidak secepat transfer internet lainnya: kecepatan unggahan Anda akan menentukan kecepatan transfer
  • Tidak ada korupsi data
  • Pilih file mana yang akan ditransfer terlebih dahulu
  • Tidak diperlukan ruang penyimpanan lokal / cloud ekstra
  • Gratis

Anda tidak memberi tahu OS mana yang Anda gunakan, tetapi ketika Anda berbicara tentang kompresi tar.gz, saya akan menganggap Anda menggunakan beberapa OS mirip GNU / Linux. Untuk itu saya akan menyarankan Transmisi . Ini adalah perangkat lunak sumber terbuka yang berjalan di Mac dan Linux. Saya menyukainya karena pengembang berupaya menjadikannya asli untuk setiap klien GUI yang mereka dukung: tidak ada bahasa lintas platform.

Anda dapat menggabungkan metode ini dengan kompresi, namun Anda akan kehilangan kemampuan untuk memprioritaskan bagian dari transfer.

Longgar
sumber
Perangkat lunak Torrent mungkin memiliki masalah yang sama dengan mengompresi perangkat lunak GUI. Menyimpan nama file ke dalam memori, dll. Juga, file torrent harus menyimpan meta data dari file tersebut. 5 juta nama file harus dikemas ke file torrent.
Ayesh K
@ AyeshK Benar, ini akan memengaruhi kinerja saat menambahkan / membuat torrent atau memeriksa checksum. Namun, saya percaya ini adalah solusi paling stabil untuk transfer data dalam jumlah besar.
LaX
Menurut torrent freak, torrent terbesar yang pernah dibagikan adalah ~ 800GB. File torrent tunggal dengan sebagian besar file berisi sekitar 33 ribu file. Tapi 5 juta file ... Saya tidak yakin.
Ayesh K
3

7z akan menjadi pilihan saya. Ini memungkinkan pemisahan arsip secara otomatis dan mendukung kompresi multi-ulir. Tidak, xztidak, terlepas dari apa yang dikatakan pesan bantuan. Coba dengan:

7za a -v100m -m0=lzma2 -mx=9 -ms=on -mmt=$THREADS archive.7z directory/

Output dibagi menjadi 100MB blok (ubah dengan -vswitch).

Satu-satunya downside nyata adalah bahwa 7z tidak mempertahankan metadata unix (mis. Izin dan pemilik). Jika Anda membutuhkannya, gunakan taroutput pipa 7za(lihat man 7zauntuk beberapa contoh).

Stefano Sanfilippo
sumber
1
The only real downsidetapi apa kerugiannya!
njzk2
@ njzk2 sebenarnya tergantung pada skenario. Misalnya, jika Anda mengirim gambar cadangan atau database dumping Anda mungkin tidak terlalu peduli tentang izin.
Stefano Sanfilippo
Saya tidak mengerti maksud menggunakan 7z untuk pemisahan, ketika Anda bisa menggunakan splitfile .tar.gz, dan tetap menggunakan metadata.
njzk2
@ njzk2 juga terbagi. Terutama, ia memiliki kompresi multi-berulir dengan LZMA2. Tidak ada utilitas unix lain yang saya sadari mendukungnya. 7z juga memiliki mode kompresi non-solid, yang merupakan langkah maju ketika hanya file tertentu yang harus diakses melalui tarpendekatan.
Stefano Sanfilippo
3

Saya mengklik kanan folder dan mengklik "buat arsip" dan memilih opsi .tar.gz. Struktur direktori sangat dalam, lebih dari 500.000 direktori

Ya, semoga berhasil untuk mengemasnya. Dan alat GUI akan mencoba melakukan itu pada volume yang sama, yang berarti a) Anda memerlukan ruang kosong 1TB lagi dan b) kepala meronta-ronta membaca satu file dan menambahkannya ke arsip tidak akan terlalu sehat untuk drive.

Saya melihat dua kemungkinan:

1) rsync dari komputer Anda ke pihak ke-3. Satu atau yang lain akan membutuhkan alamat IP global yang tidak sering berubah. The besar keuntungan dari rsync adalah jika Anda mendapatkan terganggu untuk alasan apapun, itu dapat mengambil mana ia tinggalkan. Menyalin tarbal 1 TB akan berhasil atau gagal

2) membeli drive eksternal 1TB, menyalin sesuatu ke sana, dan mengirimkan drive. Latensi tinggi, tetapi bandwidth sangat bagus saat tiba. Berbagai layanan pencadangan online untuk ini untuk pencadangan awal.

paul
sumber
1
XKCD wajib .
PythonNut
1

Saya sarankan Anda untuk menggunakan sesuatu seperti:

tar -c -L 104857600 -f file1.tar -f file2.tar -f file3.tar -f file4.tar -f file5.tar -f file6.tar -f file7.tar -f file8.tar -f file9.tar -f file10.tar 
gzip file*.tar

yang akan membuat 10 file yang paling besar akan 100GB. Tapi itu tidak akan menjawab masalah "OOM" Anda karena tar seharusnya mengalirkannya baca / tulis sehingga hambatannya adalah gzip.

mveroone
sumber
0

Bagaimana tentang itu:

find /path | tar -T - -czf - | ssh remotehost "cd /target/dir/; tar xzf -"
  • find pencarian daftar pohon direktori
  • tar -T - membaca daftar dari stdin
  • -czf -membuat arsip dan menulis ke stdout, zgzips stream
  • ssh remotehost masuk ke remotehost menggunakan ssh
  • cd /target/dir/ ubah ke direktori target
  • tar xzf - ekstrak aliran yang masuk dari stdin
kekacauan
sumber
Cuplikan kecil yang bagus. Meskipun saya pikir kebutuhannya di sini adalah fitur kompresi sebagian besar, karena tujuannya adalah untuk "mentransfer ke teman"
mveroone
Tidak sepenuhnya membuat arsip akan terluka ketika koneksi terputus, yang tidak sepenuhnya tidak mungkin saat mentransfer 1 TB, baik karena pemadaman jaringan (masih ada ISP yang memutuskan Anda setiap 24 jam) atau alasan lain.
Jonas Schäfer