Çok fazla RAM kullanmadan gzipped tar dosyası oluşturmaya çalışıyorum. Yapmak istediğim şeyin Bash eşdeğerdir: ben hem onlar aktarımı destekleyen demek tar ve flate2 kütüphaneleri, kullanıyorumÇok fazla RAM kullanmadan gzipped tar dosyası nasıl oluşturulur?
tar -cf - -C $INPUT . | gzip -cv - > $OUTPUT
. Birini diğerine nasıl aktarabileceğimi anlayamıyorum. Write
uygulamacılarına bakmayı denedim, ancak gereksinimlerime uyan bir akış türü görmüyorum.
Geçerli uygulamam istenen çıktıya (yani .tar.gz dosyası) sahiptir, ancak özellikle dosya boyutu büyük olduğunda çok fazla RAM kullanır. Oluşturulan dosya ayrıca giriş boyutu büyük olduğunda "katran: arşivde beklenmedik EOF" verir, ancak küçük girişler için iyidir. Bu bana, Bash'in istediği gibi akışları pipetlemediğini gösteriyor.
use flate2::write::GzEncoder;
use flate2::Compression;
use std::fs::File;
use tar::Builder;
// Create tar archive
let mut archive = Builder::new(Vec::new());
archive.append_dir_all("myfiles", "myfiles")?;
// Gzip tar archive and write to file
let compressed_file = File::create("backup.tar.gz")?;
let mut encoder = GzEncoder::new(compressed_file, Compression::Default);
encoder.write(&archive.into_inner()?)?;
encoder.finish()?;
Bu, "encoder", "Builder :: new (encoder)" öğesine taşındığından, ancak daha sonra "encoder.finish()") için kullanıldığından derleme yapmaz. –
@NicolasChan Gosh, üzgünüm! Bunu test edemedim ve beynim henüz geçerli bir Rust derleyicisi değil: cevabımı düzenledim, kod şimdi çalışmalı. –