Cách tốt nhất để thực hiện một bản sao song song trên Unix là gì?


17

Tôi thường xuyên phải sao chép nội dung của một thư mục trên hệ thống tệp mạng vào máy tính cục bộ của mình. Có nhiều tệp (1000) trên thư mục từ xa tương đối nhỏ nhưng do chi phí mạng, một bản sao thông thường cp remote_folder/* ~/local_folder/mất một thời gian rất dài (10 phút).

Tôi tin rằng đó là vì các tệp đang được sao chép liên tục - mỗi tệp sẽ đợi cho đến khi phần trước hoàn thành trước khi bản sao bắt đầu.

Cách đơn giản nhất để tăng tốc độ của bản sao này là gì? (Tôi cho rằng đó là để thực hiện các bản sao song song.)

Nén các tệp trước khi sao chép sẽ không nhất thiết phải tăng tốc mọi thứ vì chúng có thể được lưu trên các đĩa khác nhau trên các máy chủ khác nhau.


Nén các tệp trước khi sao chép sẽ tăng tốc mọi thứ một cách ồ ạt vì không cần thêm "bạn đã lấy tệp đó", "vâng, tôi đã làm", "đây là cái tiếp theo", "được", ... Đó là những thứ đó "quay vòng" làm bạn chậm lại.
David Schwartz

Đó có thể là tốc độ ổ đĩa, thay vì tốc độ mạng, đó là yếu tố hạn chế của bạn và nếu đó là trường hợp thì việc thực hiện điều này trên mỗi tệp song song sẽ khiến hoạt động chậm hơn , không nhanh hơn, vì bạn sẽ buộc đĩa phải liên tục tìm kiếm qua lại giữa các tập tin.
Joel Coehoorn

Mặc dù nén có thể không phải là một ý tưởng tốt (chạy quá trình nén hơn 1000 tệp có thể mất một chút thời gian), tar có thể khả thi.
Cướp

@JoelCoehoorn vẫn còn, có những trường hợp khi đây không phải là trường hợp: ví dụ: nhiều trục chính + tệp nhỏ (hoặc chỉ đơn giản là đọc ngẫu nhiên). Trong kịch bản này, "cp song song" sẽ giúp ích.
CAFxX

Câu trả lời:


8

Miễn là bạn giới hạn các lệnh sao chép mà bạn đang chạy, có thể bạn có thể sử dụng tập lệnh giống như tập lệnh được đăng bởi Scrutinizer

SOURCEDIR="$1"
TARGETDIR="$2"
MAX_PARALLEL=4
nroffiles=$(ls "$SOURCEDIR" | wc -w)
setsize=$(( nroffiles/MAX_PARALLEL + 1 ))
ls -1 "$SOURCEDIR"/* | xargs -n "$setsize" | while read workset; do
  cp -p "$workset" "$TARGETDIR" &
done
wait

1
Lưu ý về cảnh báo mặc dù: Kịch bản này bị hỏng với tên tệp chứa khoảng trắng hoặc ký tự nối.
slhck

@OldWolf - Bạn có thể giải thích kịch bản này hoạt động như thế nào không? Ví dụ, phần nào thực hiện song song?
DSG

3
@dsg: Ở &cuối cplệnh cho phép whilevòng lặp tiếp tục và bắt đầu lệnh cp tiếp theo mà không phải chờ đợi. Các xargslệnh vượt qua tên tập tin trong nhóm 4 (MAX_PARALLEL) đến whilevòng lặp.
RedGrittyBrick

Không làm việc cho tôi. Tôi không chắc có thể tăng tốc cp. Bạn có thể tăng tốc tính toán thông qua đa luồng. Nhưng tôi không nghĩ rằng việc giữ dữ liệu ổ cứng cũng vậy.
Adobe


3

Một cách sẽ là sử dụng rsync , nó sẽ chỉ sao chép các thay đổi - các tệp mới và các phần đã thay đổi của các tệp khác.

http://linux.die.net/man/1/rsync

Chạy bất kỳ hình thức hoạt động sao chép song song nào cũng có thể làm ngập mạng của bạn và hoạt động sao chép sẽ bị đình trệ hoặc bị tắc nghẽn tại đĩa nguồn hoặc đĩa đích.


2

Thành thật mà nói, công cụ tốt nhất là gsutil của Google. Nó xử lý các bản sao song song với đệ quy thư mục. Hầu hết các phương pháp khác mà tôi thấy không thể xử lý đệ quy thư mục. Họ không đề cập cụ thể đến hệ thống tệp cục bộ đến các bản sao hệ thống tệp cục bộ trong tài liệu của họ, nhưng nó hoạt động như một nét quyến rũ.

Đây là một nhị phân khác để cài đặt, nhưng có lẽ là một thứ bạn có thể đã chạy khi xem xét tất cả việc áp dụng dịch vụ đám mây hiện nay.


2

Rsync song song bằng cách sử dụng find:

export SOURCE_DIR=/a/path/to/nowhere
export DEST_DIR=/another/path/to/nowhere

# sync folder structure first
rsync -a -f'+ */' -f'- *' $SOURCE_DIR $DEST_DIR

# cwd
cd $SOURCE_DIR

# use find to help filter files etc. into list and pipe into gnu parallel to run 4 rsync jobs simultaneously
find . -type f | SHELL=/bin/sh parallel --linebuffer --jobs=4 'rsync -av {} $DEST_DIR/{//}/'

trên mạng LAN công ty, rsync đơn có tốc độ khoảng 800Mbps; với 6-8 công việc tôi có thể nhận được hơn 2,5Gbps (với chi phí tải cao). Giới hạn bởi các đĩa.


0

Có nhiều điều người ta có thể phải xem xét tùy thuộc vào cấu trúc liên kết bạn có. Nhưng trước khi bạn bắt đầu nghĩ về các giải pháp phức tạp, bạn có thể chỉ cần cố gắng phân chia nhiệm vụ cho hai công việc và kiểm tra xem thời gian cần thiết sẽ giảm đáng kể:

Lần sau hãy thử:

  cp remote_folder/[a-l]* ~/local_folder/ &
  cp remote_folder/[!a-l]* ~/local_folder/ &
  wait
  wait

(bạn có thể muốn thay thế [al] * thành một thứ khác khớp với khoảng một nửa số tệp - có thể [0-4] * - tùy thuộc vào nội dung của thư mục)

Nếu thời gian cải thiện không đáng kể, có thể điều quan trọng hơn là kiểm tra xem có cần sao chép tất cả các tệp không (tỷ lệ của các tệp đã thay đổi đối với tất cả các tệp là bao nhiêu?)

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.