Tôi đang cố gắng tạo một tệp tar gzipped mà không cần nó chiếm nhiều RAM. Các Bash tương đương với những gì tôi muốn làm là:Làm thế nào để tạo một tệp tar gzipped mà không cần sử dụng nhiều RAM?
tar -cf - -C $INPUT . | gzip -cv - > $OUTPUT
Tôi đang sử dụng tar và flate2 thư viện, mà cả hai cho biết họ ủng hộ trực tuyến. Tôi không thể tìm ra cách để dòng một trong những khác. Tôi đã thử xem xét các triển khai Write
, nhưng không thấy một loại luồng phù hợp với nhu cầu của tôi.
Triển khai hiện tại của tôi có đầu ra mong muốn (cụ thể là tệp .tar.gz), nhưng nó sử dụng nhiều RAM, đặc biệt khi kích thước tệp lớn. Tệp được tạo cũng cung cấp "tar: EOF không mong muốn trong kho lưu trữ" khi kích thước đầu vào lớn, nhưng tốt với đầu vào nhỏ. Điều này chỉ ra với tôi rằng nó không phải là đường ống các dòng như Bash sẽ.
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()?;
Điều này không biên dịch vì 'bộ mã hóa' được chuyển sang' Bộ dựng :: mới (bộ mã hóa) 'nhưng sau này được sử dụng trong' encoder.finish() '. –
@NicolasChan Gosh, tôi xin lỗi! Tôi đã không thể kiểm tra nó, và bộ não của tôi không phải là một trình biên dịch Rust hợp lệ được nêu ra: o Tôi đã chỉnh sửa câu trả lời của tôi, mã sẽ hoạt động ngay bây giờ. –