Cách khác biệt các tệp lớn trên Linux


31

Tôi đang gặp diff: memory exhaustedlỗi khi cố gắng tìm khác biệt hai tệp 27 GB tương tự như trên hộp Linux với CentOS 5 và 4 GB RAM. Đây là một vấn đề được biết đến, có vẻ như.

Tôi hy vọng sẽ có một sự thay thế cho một tiện ích thiết yếu như vậy, nhưng tôi không thể tìm thấy. Tôi tưởng tượng giải pháp sẽ phải sử dụng các tệp tạm thời thay vì bộ nhớ để lưu trữ thông tin cần thiết.

  • Tôi đã thử sử dụng rdiffxdelta, nhưng chúng tốt hơn để hiển thị các thay đổi giữa hai tệp, như một bản vá và không hữu ích cho việc kiểm tra sự khác biệt giữa hai tệp.
  • Đã thử VBinDiff , nhưng nó là một công cụ trực quan tốt hơn để so sánh các tệp nhị phân. Tôi cần một cái gì đó có thể chuyển sự khác biệt sang STDOUT như thường lệ diff.
  • Có rất nhiều tiện ích khác như vimdiffchỉ hoạt động với các tệp nhỏ hơn.
  • Tôi cũng đã đọc về Solaris bdiffnhưng tôi không thể tìm thấy cổng cho Linux.

Bất kỳ ý tưởng ngoài việc chia các tập tin thành các phần nhỏ hơn? Tôi có 40 trong số các tệp này vì vậy cố gắng tránh công việc phá vỡ chúng.


Phiên bản nào của xdelta bạn đã thử? xdelta3 hay xdelta1?
nmuntz

Đó là phiên bản 1.1.4. Xdelta3 có cung cấp chức năng khác nhau không? Tôi mới kiểm tra tài liệu trực tuyến và dường như vẫn là về việc cung cấp "deltas".
Tom B


Xem thêm câu trả lời này: unix.stackexchange.com/a/77259/27186
unhammer

Câu trả lời:


12

cmpthực hiện mọi thứ theo từng byte, do đó có thể nó sẽ hết bộ nhớ (chỉ kiểm tra nó trên hai tệp 7 GB) - nhưng bạn có thể đang tìm kiếm chi tiết hơn danh sách "các tệp XY khác nhau ở byte x , dòng y ". Nếu các điểm tương đồng của các tệp của bạn được bù đắp (ví dụ: tệp Y có một khối văn bản giống hệt nhau, nhưng không ở cùng một vị trí), bạn có thể chuyển offset sang cmp; bạn có thể có thể biến nó thành một so sánh đồng bộ hóa với một tập lệnh nhỏ.

Ngoài ra: Trong trường hợp bất kỳ ai khác hạ cánh ở đây khi tìm cách xác nhận rằng hai cấu trúc thư mục (chứa các tệp rất lớn) giống hệt nhau: diff --recursive --brief(hoặc diff -r -qngắn gọn, hoặc thậm chí có thể diff -rq) sẽ hoạt động và không hết bộ nhớ.


thật tuyệt, tôi nghĩ -q là chìa khóa ở đây, bằng cách nào đó không có nó có thể yêu cầu diff để đặt toàn bộ tập tin (hoặc ít nhất là toàn bộ dòng) vào bộ nhớ ...
rogerdpack

7

Tôi tìm thấy liên kết này

diff -H có thể giúp hoặc bạn có thể thử cài đặt cổng textproc / 2bsd-diff mà dường như không cố tải các tệp vào RAM, vì vậy nó có thể hoạt động trên các tệp lớn dễ dàng hơn.

Tôi không chắc nếu bạn đã thử hai tùy chọn đó hoặc nếu chúng có thể phù hợp với bạn. Chúc may mắn.


1
Điều này có giúp ích cho bất cứ ai ngoài đó không? Đối với tôi, cùng một thất bại ...
rogerdpack

12
Đối với bất cứ ai tự hỏi: diff -Hlà một bí danh không có giấy tờ và không được chấp nhận cho diff --speed-large-files.
a3nm

1
Câu trả lời này không có ích. Đây là một câu hỏi linux và để cài đặt 2bsd-diff, bạn sẽ phải chuyển nó trước. Sau khi bạn tìm thấy một nguồn . Và vá nó . Có thể, nhưng không chắc là một giải pháp khả thi.
nyov

1

Nếu các tệp giống hệt nhau (cùng độ dài) ngoại trừ một vài giá trị byte, bạn có thể sử dụng tập lệnh như sau ( wlà số byte trên mỗi dòng thành hexdump, điều chỉnh theo chiều rộng hiển thị của bạn):

w=12;
while read -ru7 x && read -ru8 y;
do
  [ ".$x" = ".$y" ] || echo "$x | $y";
done 7< <(od -vw$w -tx1z FILE1) 8< <(od -vw$w -tx1z FILE2) > DIFF-FILE1-FILE2 &

less DIFF-FILE1-FILE2

Nó không nhanh lắm, nhưng làm được việc.

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.