2016-08-10 15 views
6

Tôi hiện đang thực hiện sắp xếp UNIX (qua GitBash trên máy Windows) của tệp văn bản 500GB. Do hết dung lượng trên đĩa chính, tôi đã sử dụng tùy chọn -T để hướng các tệp tạm thời vào đĩa nơi tôi có đủ không gian để chứa toàn bộ tệp. Vấn đề là, tôi đã xem không gian đĩa và dường như các tập tin tạm thời đã vượt quá những gì tập tin ban đầu được. Tôi không biết có bao nhiêu điều này sẽ đi xa hơn, nhưng tôi tự hỏi nếu có một quy tắc mà tôi có thể dự đoán bao nhiêu không gian tôi sẽ cần cho các tập tin tạm thời.Không gian đĩa cần thiết cho unix sắp xếp

+2

Nếu sắp xếp Unix hoạt động tương tự như sắp xếp GNU, thì mật khẩu ban đầu sẽ tạo các tệp tạm thời dựa trên kích thước ram. Giả sử có 1GB ram có thể được sử dụng để phân loại trong bộ nhớ, sau đó nó sẽ tạo ra 500 tập tin 1gb, sau đó lặp lại 16 cách sáp nhập vào các tập tin đó. Ngoài ra giả định rằng nó xóa các tập tin sau mỗi lần hợp nhất, sau đó nó sẽ cần 516 gb không gian, với mỗi tệp được làm tròn lên đến một ranh giới kích thước (phân bổ tệp). Trong lần hợp nhất cuối cùng, không gian đĩa được yêu cầu sẽ tăng gấp đôi kích thước tệp (được làm tròn thành liên kết cụm), do đó, trên 1.000 GB. – rcgldr

+0

Chuột! Có vẻ như tôi sẽ phải đầu tư thêm một chút dung lượng. – Thoughtcraft

+0

Đây có phải là lần hợp nhất cuối cùng trong thư mục tạm thời không? Tôi hướng dẫn đầu ra đến một vị trí khác với temp với hy vọng tránh có hai bản sao hoàn chỉnh của tệp trên một đĩa. – Thoughtcraft

Trả lời

0

Tôi muốn theo lô theo cách thủ công như được mô tả trong this unix.SE answer.

Tìm một số truy vấn rất cơ bản sẽ chia nội dung của bạn thành các phần đủ nhỏ để sắp xếp. Ví dụ: nếu đó là tệp từ, bạn có thể tạo các truy vấn như grep ^a …, grep ^b …, v.v. Một số mục có thể cần chi tiết hơn so với các mục khác.

Bạn có thể kịch bản thích:

#!/bin/bash 
for char1 in other {0..9} {a..z}; do 
    out="/tmp/sort.$char1.xz" 
    echo "Extracting lines starting with '$char1'" 
    if [ "$char1" = "other" ]; then char1='[^a-z0-9]'; fi 
    grep -i "^$char1" *.txt |xz -c0 > "$out" 
    unxz -c "$out" |sort -u >> output.txt || exit 1 
    rm "$out" 
done 
echo "It worked" 

Tôi đang sử dụng xz -0 vì nó gần như là nhanh như mặc định gzip của gzip -6 nhưng nó là bao la tốt hơn ở bảo tồn không gian. Tôi bỏ qua nó từ đầu ra cuối cùng để duy trì giá trị thoát của sort -u, nhưng thay vào đó bạn có thể sử dụng kiểm tra kích thước (iirc, sắp xếp thất bại với đầu ra bằng không) và sau đó sử dụng sort -u |xz -c0 >> output.txt.xz vì vùng chứa xz (và gzip) cho phép bạn nối lưu trữ (Tôi cũng đã written about that trước đó).

này hoạt động vì đầu ra của mỗi lần chạy grep đã được sắp xếp (0 là trước 1, đó là trước khi a, vv), do đó lắp ráp cuối cùng không cần phải chạy qua sort (lưu ý, các "khác" phần sẽ hơi khác vì một số ký tự không phải chữ và số là trước số, các ký tự khác nằm giữa các số và chữ cái, còn các ký tự khác nằm sau chữ cái. Bạn cũng có thể xóa cờ -i của grep và lặp lại thông qua {A..Z} để phân biệt chữ hoa chữ thường). Mỗi lần lặp lại cá nhân rõ ràng vẫn cần được sắp xếp, nhưng hy vọng chúng có thể quản lý được.

Nếu chương trình thoát trước khi hoàn thành tất cả các lần lặp lại và nói "Nó hoạt động" thì bạn có thể chỉnh sửa tập lệnh với một lô riêng biệt cho lần lặp cuối cùng mà nó đã thử. Xóa tất cả các lần lặp lại trước khi chúng được lưu thành công trong tệp output.txt.

Các vấn đề liên quan