Làm thế nào để sắp xếp các tập tin lớn?


35

Tôi có một PC với CPU Intel (R) Pentium (R) G640 @ 2.80 GHz và 8 GB RAM. Tôi đang chạy Science Linux 6.5 trên nó với hệ thống tập tin EXT3.

Trong thiết lập này, cách nhanh nhất tôi có thể thực hiện sort -utrên tệp 200 gigabyte là gì?

Tôi có nên chia tệp thành các tệp nhỏ hơn (nhỏ hơn 8 GB) sort -u, đặt chúng lại, đặt chúng lại với nhau, sau đó chia lại chúng ở một kích thước khác sort -u, v.v.? Hoặc có bất kỳ tập lệnh sắp xếp, chương trình nào có thể xử lý các tập tin lớn này với dung lượng RAM hạn chế của tôi không?


6
Vui lòng chỉnh sửa câu hỏi của bạn và giải thích những gì xảy ra khi bạn thử lệnh bạn đã đăng. Bạn có hết dung lượng đĩa không? Lệnh sẽ hoạt động miễn là bạn có đủ không gian trống trên /tmp.
terdon


1
Câu trả lời được chọn về cơ bản nói lên những gì @terdon đang nói, nhưng cũng hãy kiểm tra câu này - stackoverflow.com/a/13025731/2801913 . parallelTôi nghĩ bạn sẽ cần GNU cho điều này hơn là các phần mềm parallelđược cài đặt theo mặc định trên một số hệ thống.
Graeme

1
Bạn có thể tải tệp lên Amazon S3, sau đó quay vòng công việc Giảm bản đồ đàn hồi với vài trăm nút để sắp xếp tệp!
Alan Shutko

2
sort(1)có thể hết không gian trên /tmp; nếu vậy, bạn có thể chỉ định một khu vực khác cho các tệp tạm thời với biến môi trường TMPDIRhoặc cờ-T=<tmpdir>
vonbrand

Câu trả lời:


46

GNU sort(là mặc định trên hầu hết các hệ thống Linux), có một --paralleltùy chọn. Từ http://www.gnu.org/software/coreutils/manual/html_node/sort-invocation.html :

'- Vô song = n'

Đặt số lượng các loại chạy song song với n. Theo mặc định, n được đặt thành số lượng bộ xử lý có sẵn, nhưng giới hạn là 8, vì có hiệu suất giảm dần sau đó. Cũng lưu ý rằng việc sử dụng n luồng làm tăng mức sử dụng bộ nhớ theo hệ số log n. Cũng xem lời mời nproc.

Vì cpu của bạn có 2 lõi, bạn có thể làm:

sort --parallel=2 -uo list-sorted.txt list.txt

Tốt hơn là chỉ định số lượng lõi thực tế vì có thể xuất hiện nhiều hơn do bộ xử lý có siêu phân luồng .

Bạn cũng có thể thử nghiệm niceđể tác động đến mức ưu tiên lập lịch của bộ xử lý và ioniceảnh hưởng đến lập lịch I / O. Bạn có thể tăng mức độ ưu tiên so với các quy trình khác như thế này, tôi không nghĩ rằng điều này sẽ mang lại cho bạn khoản tiết kiệm lớn vì chúng thường tốt hơn để đảm bảo quy trình nền không sử dụng quá nhiều tài nguyên. Không bao giờ bạn có thể kết hợp chúng với một cái gì đó như:

nice -n -20 ionice -c2 -n7 sort --parallel=2 -uo list-sorted.txt list.txt

Cũng lưu ý rằng như Gilles đã nhận xét, sử dụng một lệnh sắp xếp GNU sẽ nhanh hơn bất kỳ phương pháp phá vỡ sắp xếp nào khác vì thuật toán đã được tối ưu hóa để xử lý các tệp lớn. Bất cứ điều gì khác có thể sẽ chỉ làm mọi thứ chậm lại.


10
Và bạn nên lưu ý rằng gọi điện sorttrực tiếp tốt hơn bất cứ điều gì khác mà bạn có thể giải quyết. GNU sort được thiết kế để đối phó tốt với các tệp lớn hơn nhiều so với RAM.
Gilles 'SO- ngừng trở thành ác quỷ'

Tùy chọn sắp xếp - vô tuyến không hoạt động trên các máy chủ RH6.5 của tôi. Sắp xếp --version nghĩ rằng nó đi ra từ coreutils 8.4. Phiên bản nào tôi cần cho phiên bản song song?
markus_b

3
Xem thêm superuser.com/questions/938558/sort-pool-isnt- Championsizing - bạn có thể phải chỉ định một cái gì đó như -S512M nếu bạn nhận thấy nó không thực sự song song.
unhammer

46

Sử dụng sortlệnh có thể sẽ là lựa chọn nhanh nhất.

Nhưng có lẽ bạn sẽ muốn sửa miền địa phương thành C.

sort -ukhông báo cáo các dòng duy nhất, nhưng một trong mỗi dòng sắp xếp giống nhau. Trong ngôn ngữ C, 2 dòng khác nhau nhất thiết không giống nhau, nhưng đó không phải là trường hợp trong hầu hết các ngôn ngữ dựa trên UTF-8 trên các hệ thống GNU.

Ngoài ra, sử dụng ngôn ngữ C sẽ tránh được chi phí phải phân tích UTF-8 và xử lý các đơn đặt hàng phức tạp để cải thiện hiệu suất đáng kể.

Vì thế:

LC_ALL=C sort -u file

Bạn cũng có thể cải thiện hiệu suất bằng cách sử dụng ổ đĩa nhanh hơn (hoặc ổ đĩa khác với ổ đĩa có tệp đầu vào và / hoặc đầu ra) cho các tệp tạm thời (sử dụng -Thoặc $TMPDIRbiến môi trường) hoặc bằng cách sử dụng -Stùy chọn được hỗ trợ bởi một số sorttriển khai) .

Đối với một số loại đầu vào hoặc cho lưu trữ chậm, sử dụng --compress-programtùy chọn GNU sort(ví dụ với lzop) có thể cải thiện hiệu suất bên cạnh việc sử dụng lưu trữ.


Bây giờ chỉ là một lưu ý cho những người phản đối (đúng ở một mức độ nào đó) rằng nó sẽ không đúng thứ tự :

Tôi đồng ý rằng với tư cách là một con người, tôi muốn thấy Stéphane sắp xếp giữa StefanStephanie , nhưng:

  • Một máy tính sẽ muốn Stéphane sắp xếp sau é(ít nhất là khi được biểu thị bằng U + 00E9) dưới dạng một ký tự hoặc các byte của mã hóa UTF-8 sắp xếp sau (về giá trị mã hoặc giá trị byte). Đó là một thứ tự sắp xếp rất đơn giản để thực hiện và là một tổng số nghiêm ngặt và không có gì bất ngờ.
  • Thứ tự sắp xếp địa phương của bạn có thể sẽ không thỏa đáng trong nhiều trường hợp ngay cả với con người. Ví dụ: trên hệ thống của tôi với ngôn ngữ en_GB.utf8 mặc định:

    • StéphaneStéphane (một với U + 00E9, một với eU + 0301) không sắp xếp giống nhau:

      $ printf '%b\n' 'Ste\u0301phane' 'St\u00e9phane' | sort -u
      Stéphane
      Stéphane
      
    • nhưng,, ② tất cả đều giống nhau (rõ ràng là một lỗi trong các định nghĩa miền địa phương):

      $ printf '%s\n' ③ ① ② | sort -u
      ③
      

      Ở đây, đó là, nhưng nó cũng có thể là ① hoặc

Vì vậy, IMO, rất có thể bạn luôn muốn sort -uvới LC_ALL = C, nếu bạn muốn các dòng duy nhất. Và nếu bạn muốn danh sách kết quả đó được sắp xếp theo thứ tự sắp xếp của người dùng, hãy chuyển nó thành sortmột lần nữa:

LC_ALL=C sort -u | sort

LC_ALL=C sort | LC_ALL=C uniq -c | sort -k2

8
+1 cho cài đặt ngôn ngữ: nó có thể có ảnh hưởng rất lớn đến hiệu suất
Adrian Pronk

1
Vâng. sắp xếp tệp với 250000 dòng, LC_ALL tăng tốc 8 lần.
Jan Vlcinsky

-1

Dưới đây là một tập lệnh bash sẵn sàng để sắp xếp dữ liệu tỷ lệ TB trên một máy thông thường có vài GB GB: http://sgolconda.blogspot.com/2015/11/sort-very-large-dataset.html Nó kiểm tra số lượng lõi máy của bạn như và sử dụng tất cả các lõi. Có thể sắp xếp, tập tin số hoặc chuỗi. Có thể được sử dụng để tìm các bản ghi duy nhất trong dữ liệu quy mô TB.


Đây không phải là một gợi ý tốt. Kịch bản quá lớn và chia nhỏ tệp đầu vào để sắp xếp các phần mà câu trả lời được chấp nhận chỉ ra không cần thiết với sắp xếp GNU.
Thorbjørn Ravn Andersen
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.