Vấn đề về bộ nhớ khi nén và chuyển một số lượng lớn tệp nhỏ (tổng cộng 1TB)


15

Tôi có 5 triệu tệp chiếm khoảng 1TB dung lượng lưu trữ. Tôi cần chuyển các tập tin này cho bên thứ ba.

Cách tốt nhất để làm điều này là gì? Tôi đã thử giảm kích thước bằng cách sử dụng .tar.gz, nhưng mặc dù máy tính của tôi có RAM 8GB, tôi vẫn gặp lỗi "hết bộ nhớ hệ thống".

Là giải pháp tốt nhất để gửi thư qua các tập tin?


9
Bạn đang gặp vấn đề TẠO a .tar.gzhoặc SAO CHÉP tệp nén kết quả? Dù bằng cách nào, một cái gì đó là lạ, bởi vì không hoạt động nào nên tiêu thụ nhiều bộ nhớ hơn chỉ vì các tệp lớn. Đó là, cả hai hoạt động nên được phát trực tuyến. Vui lòng bao gồm thêm thông tin về chính xác các lệnh đang thất bại.
Celada

1
Bạn và bên thứ ba dự phòng có bao nhiêu băng thông? Một rsync ngây thơ có thể giúp bạn tiết kiệm bưu chính. Nhưng tôi không biết các tệp "năm triệu" sẽ hoạt động như thế nào vì rsync sẽ cố gắng xây dựng bộ nhớ trong filelist và có thể nếu liệt kê (các tệp 5e6)> 8 GB. Và tất nhiên nó sẽ chậm.
Kalvin Lee

2
@oshirowanen Tôi không nghĩ rằng nó nên tiêu thụ một loạt bộ nhớ tính toán danh sách tệp vì tôi khá chắc chắn tarchỉ nên lưu trữ các tệp tăng dần khi nó liệt kê chúng, không bao giờ xây dựng danh sách trong bộ nhớ. Nhưng một lần nữa, xin vui lòng hiển thị chính xác lệnh bạn đang sử dụng. Ngoài ra, có phải tất cả các tệp trong cùng một thư mục hoặc là cấu trúc thư mục rất sâu?
Celada

3
À đúng rồi, các chương trình GUI tốt thường được xây dựng mà không chú trọng nhiều đến các mục tiêu như khả năng mở rộng và mạnh mẽ. Tôi sẽ không ngạc nhiên nếu đó là lỗi của trình bao bọc / giao diện GUI. Tạo tập tin bằng dòng lệnh và tôi nghĩ bạn sẽ thấy rằng nó hoạt động tốt.
Celada

3
1 TB dữ liệu sẽ mất ít nhất 22 giờ để truyền trên kết nối băng thông rộng 100 Mbit / s. Vì vậy, tùy thuộc vào mức độ nén mà bạn mong muốn đạt được, thư thực sự có thể là tùy chọn nhanh hơn.
Dan

Câu trả lời:


27

Thông tin bổ sung được cung cấp trong các nhận xét cho thấy OP đang sử dụng phương thức GUI để tạo .tar.gz tệp.

Phần mềm GUI thường bao gồm nhiều sự phình to hơn phần mềm tương đương dòng lệnh tương đương hoặc thực hiện các tác vụ không cần thiết bổ sung vì lợi ích của một số tính năng "phụ" như thanh tiến trình. Tôi sẽ không ngạc nhiên nếu phần mềm GUI đang cố thu thập danh sách tất cả các tên tệp trong bộ nhớ. Không cần thiết phải làm điều đó để tạo một kho lưu trữ. Các công cụ chuyên dụng targzip được thiết kế chắc chắn để hoạt động với đầu vào và đầu ra trực tuyến, điều đó có nghĩa là chúng có thể xử lý đầu vào và đầu ra lớn hơn nhiều so với bộ nhớ.

Nếu bạn tránh chương trình GUI, rất có thể bạn có thể tạo tệp lưu trữ này bằng cách sử dụng lệnh targọi hàng ngày hoàn toàn bình thường như thế này:

tar czf foo.tar.gz foo

đâu foolà thư mục chứa tất cả 5 triệu tệp của bạn.

Các câu trả lời khác cho câu hỏi này cung cấp cho bạn một vài tarlệnh thay thế bổ sung để thử trong trường hợp bạn muốn chia kết quả thành nhiều phần, v.v ...


15

Tổng cộng "năm triệu" tệp và tổng cộng 1TB? Các tập tin của bạn phải rất nhỏ, sau đó. Tôi chỉ đơn giản là thử rsync:

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

Nếu bạn không có điều đó - hoặc trường hợp sử dụng của bạn không cho phép sử dụng rsync, ít nhất tôi sẽ kiểm tra xem có 7zhoạt động với dữ liệu của bạn không. Nó có thể không, nhưng tôi nghĩ nó vẫn đáng để thử:

7z a archive.7z /source/dir

Hoặc nếu bạn không cảm thấy thoải mái với 7zít nhất hãy thử tạo một .tar.xzkho lưu trữ:

tar cJv archive.tar.xz /source/dir

(cần lưu ý rằng các phiên bản cũ hơn tarkhông tạo .tar.xztài liệu lưu trữ, nhưng .tar.lzmatài liệu lưu trữ, khi sử dụng công Jtắc. Ngay cả các phiên bản cũ hơn tar, không hỗ trợ Jcờ hoàn toàn.)


Vì bạn đang sử dụng chương trình GUI để tạo các tệp đó, tôi cho rằng bạn cảm thấy hơi khó chịu khi sử dụng giao diện dòng lệnh.

Để tạo điều kiện cho việc tạo, quản lý và trích xuất tài liệu lưu trữ từ giao diện dòng lệnh, có một tiện ích nhỏ được gọi là atool . Nó có sẵn cho thực tế mọi bản phân phối phổ biến mà tôi đã thấy và hoạt động khá nhiều trên mỗi kho lưu trữ mà tôi đã vấp ngã, trừ khi những bản lưu trữ vô vọng che khuất.

Kiểm tra xem bản phân phối của bạn có atooltrong kho của họ không, hoặc yêu cầu quản trị viên của bạn cài đặt nó, khi nó ở trong môi trường công sở.

atool cài đặt một loạt các liên kết tượng trưng cho chính nó, vì vậy việc đóng gói và giải nén trở nên dễ dàng:

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

Tạo một kho lưu trữ.

aunpack archive.7z

Mở rộng kho lưu trữ.

als archive.rar

Liệt kê nội dung tập tin.

Loại lưu trữ nào được tạo, atoolphân biệt rằng phần mở rộng tên tệp của kho lưu trữ của bạn trong dòng lệnh.


4
Ưu điểm ở đây của việc sử dụng rsynclà nếu (khi) kết nối bị ngắt, rsynccó thể chọn nơi nó bị tắt.
roaima

2
Các tập tin sẽ là trung bình 200 KB. Đó không phải là tất cả nhỏ.
Nate Eldredge

4
@NateEldredge Tôi thường nghĩ lớn như ý nghĩa> 1GB. Nhỏ thường <1MB. Khá nhỏ.
PythonNut

8

Trừ khi bạn có thể thực hiện nén tốt hơn 25: 1, bạn không thể đạt được bất cứ điều gì từ việc nén này trước khi gửi thư, trừ khi bạn có một số định dạng băng phần cứng mà bạn có thể trao đổi với bên thứ ba.

Bộ lưu trữ phổ biến lớn nhất là tia màu xanh và điều đó sẽ giúp bạn có được 40Gb. Bạn sẽ cần nén 25 đến 1 dữ liệu của mình để phù hợp với dữ liệu đó. Nếu bên thứ ba của bạn chỉ có DVD, bạn cần 125: 1 (khoảng).

Nếu bạn không thể khớp các số nén đó, chỉ cần sử dụng đĩa bình thường, sao chép và gửi thư đó cho bên thứ ba. Trong trường hợp đó, việc vận chuyển thứ gì đó nhỏ hơn ổ 1Tb cần nén là sự điên rồ.

Bạn chỉ cần so sánh điều đó với việc sử dụng ssh -C(nén tiêu chuẩn) hoặc tốt nhất là rsyncnén để sao chép các tệp qua mạng, không cần phải nén và chuyển lên trước. 1Tb không phải là không thể di chuyển qua mạng, nhưng sẽ mất một thời gian.


5
+1: "không bao giờ đánh giá thấp băng thông của một toa xe ga đầy băng từ trên đường cao tốc" (Andrew S. Tanenbaum). xem en.wikipedia.org/wiki/Sneakernet
Olivier Dulac

@OlivierDulac Tôi đã thấy các cấu trúc tương tự với Boeing 747 và các hộp chứa đầy CDROM, thật tuyệt vời khi bạn có thể nhận được loại thông lượng nào với điều đó.
Anthon

Tôi thích rằng một pidgin đánh bại một ISP bằng một cú sút xa, xem các ví dụ của trang wikipedia ^^
Olivier Dulac

6

Bạn đã xem xét torrent? Ngang hàng có thể là lựa chọn tốt nhất của bạn để chuyển qua internet:

  • Ít nhất là nhanh như các lần chuyển internet khác: tốc độ tải lên của bạn sẽ xác định tốc độ truyền
  • Không có dữ liệu tham nhũng
  • Chọn tập tin nào cần chuyển trước
  • Không cần thêm dung lượng lưu trữ cục bộ / đám mây
  • Miễn phí

Bạn đã không nói bạn đang sử dụng HĐH nào, nhưng khi bạn nói về nén tar.gz, tôi sẽ cho rằng bạn đang sử dụng một số HĐH giống như GNU / Linux. Vì vậy, tôi sẽ đề nghị Truyền . Đây là một phần mềm torrent mã nguồn mở chạy trên Mac và Linux. Tôi thích nó bởi vì các nhà phát triển đã nỗ lực để biến nó thành bản địa cho mọi máy khách GUI mà họ hỗ trợ: không có ngôn ngữ đa nền tảng.

Bạn có thể kết hợp phương pháp này với nén, tuy nhiên bạn sẽ mất khả năng ưu tiên các phần của chuyển khoản.


Phần mềm torrent có thể có cùng một vấn đề khi nén phần mềm GUI. Lưu trữ tên tệp vào bộ nhớ, v.v. Ngoài ra, các tệp torrent phải lưu trữ dữ liệu meta của các tệp. 5 triệu tên tệp nên được đóng gói vào tệp torrent.
Ayesh K

@AyeshK Đúng, điều này sẽ ảnh hưởng đến hiệu suất khi thêm / tạo torrent hoặc kiểm tra tổng kiểm tra. Tuy nhiên, tôi tin rằng đây là giải pháp ổn định nhất để chuyển lượng dữ liệu lớn.
LaX

Theo torrent freak, torrent lớn nhất từng được chia sẻ là ~ 800gb. Tệp torrent đơn với hầu hết các tệp chứa khoảng 33K tệp. Nhưng 5 triệu tệp ... Tôi không chắc chắn.
Ayesh K

3

7z sẽ là lựa chọn của tôi. Nó cho phép tự động chia nhỏ tài liệu lưu trữ và hỗ trợ nén đa luồng. Không, xzkhông, mặc dù những gì thông báo trợ giúp nói. Hãy thử với:

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

Đầu ra được chia thành các khối 100MB (thay đổi nó bằng công -vtắc).

Nhược điểm duy nhất là 7z không giữ lại siêu dữ liệu unix (ví dụ: quyền và chủ sở hữu). Nếu bạn cần điều đó, tarđầu ra đường ống 7zathay vào đó (xem man 7zamột số ví dụ).


1
The only real downsideNhưng thật là một nhược điểm!
njzk2

@ njzk2 thực sự nó phụ thuộc vào kịch bản. Chẳng hạn, nếu bạn đang gửi các bản sao lưu hình ảnh hoặc cơ sở dữ liệu, có lẽ bạn không quan tâm nhiều đến các quyền.
Stefano Sanfilippo

Tôi hoàn toàn không thấy điểm sử dụng 7z để chia tách, khi bạn có thể sử dụng splittrên tệp .tar.gz và nhận được để giữ siêu dữ liệu.
njzk2

@ njzk2 nó cũng chia tay. Chủ yếu, nó có nén đa luồng với LZMA2. Không có tiện ích unix nào khác tôi biết hỗ trợ nó. 7z cũng có chế độ nén không rắn, đây là một bước tiến tuyệt vời khi chỉ có một tệp cụ thể phải được truy cập wrt để tartiếp cận.
Stefano Sanfilippo


3

Tôi nhấp chuột phải vào thư mục và nhấp vào "tạo tệp lưu trữ" và chọn tùy chọn .tar.gz. Cấu trúc thư mục sâu, hơn 500.000 thư mục

Vâng, chúc may mắn nhận được điều đó để gói lên. Và công cụ GUI sẽ cố gắng thực hiện điều đó trên cùng một ổ đĩa, điều đó có nghĩa là a) bạn cần thêm 1Tb dung lượng trống và b) việc đọc một tệp và thêm nó vào kho lưu trữ sẽ không quá tốt cho ổ đĩa.

Tôi thấy hai khả năng:

1) rsync từ máy tính của bạn đến bên thứ 3. Một hoặc khác sẽ cần một địa chỉ IP toàn cầu không thay đổi thường xuyên. Các lớn lợi dụng rsync là nếu bạn bị gián đoạn vì lý do nào đó, nó có thể nhặt mà nó rời đi. Sao chép tarball 1Tb sẽ thành công hoặc thất bại

2) mua ổ đĩa ngoài 1Tb, sao chép mọi thứ vào ổ đĩa đó và giao ổ đĩa đó. Độ trễ cao, nhưng băng thông thực sự tốt khi nó đến. Dịch vụ sao lưu trực tuyến khác nhau này để sao lưu ban đầu.



1

Tôi đề nghị bạn sử dụng một cái gì đó như:

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

sẽ tạo ra 10 tệp có dung lượng lớn nhất là 100 GB. Nhưng điều đó sẽ không trả lời cho vấn đề "OOM" của bạn vì tar được cho là truyền phát nó đọc / ghi nên nút cổ chai là gzip.


0

Thế còn

find /path | tar -T - -czf - | ssh remotehost "cd /target/dir/; tar xzf -"
  • find tìm kiếm liệt kê cây thư mục
  • tar -T - đọc danh sách từ stdin
  • -czf -tạo một kho lưu trữ và ghi vào thiết bị xuất chuẩn, zgzips luồng
  • ssh remotehost đăng nhập vào remotehost bằng ssh
  • cd /target/dir/ thay đổi thư mục đích
  • tar xzf - trích xuất luồng đến từ stdin

Đoạn trích nhỏ đẹp. Mặc dù tôi nghĩ rằng nhu cầu của anh ấy ở đây chủ yếu là tính năng nén, vì mục đích là "chuyển cho bạn bè"
mveroone

Không tạo hoàn toàn kho lưu trữ sẽ bị tổn thương khi kết nối bị gián đoạn, điều này không hoàn toàn không xảy ra khi chuyển 1 TB, do mất mạng (vẫn có các ISP ngắt kết nối bạn sau mỗi 24 giờ) hoặc các lý do khác.
Jonas Schäfer

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.