Tôi có 1000000 4-20 kb tệp trong một thư mục. Tôi cần phải sao chép thư mục đó. Nhưng có vẻ như tôi phải thực hiện tìm kiếm cho mỗi tệp nên việc này mất khá nhiều thời gian.
Có cách nào để tôi có thể tăng tốc điều này không?
Hiện tại tôi đang nghĩ rằng nếu tôi có thể lấy được các khối đĩa mà các tệp này chiếm giữ, tôi có thể sắp xếp chúng, hợp nhất các khối gần nhau (với điều kiện là đọc tuần tự thường nhanh hơn tìm kiếm) và đọc các khối này, để chúng nằm trong RAM bộ nhớ cache (tôi có 32 GB RAM) trước khi thực hiện sao chép.
Nhưng để làm việc đó, tôi cần một cách để xác định khối nào được bật.
Tôi đang sử dụng EXT4 trên thiết bị từ tính (không phải SSD).
Biên tập:
Điều này nên hoạt động nhưng nó không:
ls |
parallel -IOO --pipe "sudo parallel -j100 hdparm --fibmap {}'|tail -n +5'" |
sort -nk 2 |
perl -ane 'if($u+10000 < $F[1]) { print "$l ",($u-$l),"\n"; $l=$F[1] } $u=$F[2]' |
sudo parallel --colsep ' ' dd if=/dev/sda1 skip={1} bs=512 count={2} '| cat >/dev/null'
Khi kiểm tra nó trên một tệp lớn, nó không lưu trữ tệp.
Chỉnh sửa2:
Dưới đây là một số điểm chuẩn. Bộ nhớ cache đã bị xóa ( echo 3 >/proc/sys/vm/drop_caches
) giữa mỗi lần chạy. Các phép đo được thực hiện với iostats -dkx 5
.
rsync -Hav foo/ bar/: 1800 KB/s
cp -a foo/ bar/: 3600 KB/s
cat sort-by-inode | parallel -j1 -X cp foo/{} bar/: 5000 KB/s
cat sort-by-inode | shuf | parallel -j1 -X cp foo/{} bar/: 3000 KB/s
cat sort-by-inode | shuf | parallel -j10 -X cp foo/{} bar/: 7000 KB/s
cat sort-by-inode | parallel -j10 -X cp foo/{} bar/: 8000 KB/s
cat sort-by-inode | parallel -j100 -X cp foo/{} bar/: 9000 KB/s
cat sort-by-inode | parallel -j500 -X cp foo/{} bar/: 10000 KB/s
Vậy chúng ta có thể học được gì từ đó?
Có vẻ như sắp xếp theo inode là một ý tưởng tốt. Nhưng có vẻ như song song nhiều cp
hiệu suất tăng hơn nữa. Điều đáng nhấn mạnh là nguồn foo/
là một đĩa từ tính, do đó, điều này tấn công huyền thoại rằng song song I / O với một trục chính sẽ không tăng tốc I / O: Song song rõ ràng và tăng tốc độ sao chép ở đây.
cp -r /mnt/dir1 /mnt/dirdest
hoặc một cái gì đó như thế cp /mnt/dir1/* /mnt/dirdest
nào?