Sắp xếp các tệp CSV lớn (90GB), vượt quá dung lượng đĩa


7

Đây là những gì tôi làm ngay bây giờ,

sort -T /some_dir/ --parallel=4 -uo file_sort.csv -k 1,3 file_unsort.csv

tệp là 90GB, tôi nhận được thông báo lỗi này

sort: close failed: /some_dir/sortmdWWn4: Disk quota exceeded

Trước đây, tôi không sử dụng tùy chọn -T và rõ ràng thư mục tmp không đủ lớn để xử lý việc này. Thư mục hiện tại của tôi có dung lượng trống khoảng 200 GB. Nó vẫn chưa đủ cho tập tin tạm thời sắp xếp?

Tôi không biết liệu tùy chọn song song có ảnh hưởng đến mọi thứ hay không.


5
Bạn dường như có một hệ thống hạn ngạch tại chỗ. Bao nhiêu trong số 200 GB đó thực sự có sẵn cho bạn? Thông báo lỗi của bạn cho thấy rằng người dùng của bạn có giới hạn đối với không gian bạn được phép sử dụng.
terdon

Ngoài ra, hãy nhớ rằng hạn ngạch (và không gian có sẵn) $HOMEcó thể khác so với trong/tmp
derobert

@terdon Đó có thể là lý do. Tôi đã kiểm tra hạn ngạch của mình và tôi chỉ có 100GB, bạn có tin được không? Tôi sẽ có một cuộc nói chuyện nghiêm túc với quản trị viên của tôi. Cảm ơn một lần nữa.
Xuezhou Zhang

Trên một hệ thống có 200 GB miễn phí và rõ ràng là một hệ thống nhiều người dùng? Vâng, tất nhiên tôi có thể tin điều đó! Bạn đang nói đùa? Bạn có đủ 50% không gian có sẵn chỉ dành cho bạn! Ồ, và bạn đang sử dụng hệ điều hành nào? Nếu bạn có quyền truy cập GNU sort, tôi có thể có cách giải quyết cho bạn.
terdon

LOL, ok, tôi không phải là một người hệ thống, nhưng tôi không tin rằng toàn bộ máy chủ chỉ có 200 GB dung lượng trống. Tôi nghĩ đó là không gian trống của afs của tôi, nhưng tôi chỉ có thể sử dụng 50% không gian được phân bổ của mình? Điều đó thật lạ.
Xuezhou Zhang

Câu trả lời:


5

Vấn đề là dường như bạn đã thiết lập hạn ngạch đĩa và người dùng của bạn không có quyền chiếm quá nhiều dung lượng /some_dir. Và không, --paralleltùy chọn không nên ảnh hưởng đến điều này.

Như một giải pháp thay thế, bạn có thể chia tệp thành các tệp nhỏ hơn, sắp xếp từng tệp một cách riêng biệt và sau đó hợp nhất chúng lại thành một tệp duy nhất:

## split the file into 100M pieces named fileChunkNNNN
split -b100M file fileChunk
## Sort each of the pieces and delete the unsorted one
for f in fileChunk*; do sort "$f" > "$f".sorted && rm "$f"; done
## merge the sorted files    
sort -T /some_dir/ --parallel=4 -muo file_sort.csv -k 1,3 fileChunk*.sorted

Phép thuật là -mtùy chọn sắp xếp của GNU (từ info sort):

‘-m’
‘--merge’
    Merge the given files by sorting them as a group.  Each input file
    must always be individually sorted.  It always works to sort
    instead of merge; merging is provided because it is faster, in the
    case where it works.

Điều đó sẽ yêu cầu bạn có ~ 180G miễn phí cho tệp 90G để lưu trữ tất cả các phần. Tuy nhiên, việc sắp xếp thực tế sẽ không chiếm nhiều dung lượng vì bạn sẽ chỉ sắp xếp theo từng phần 100 triệu.


Điều đó dường như làm việc. Tôi sẽ thử. Trong thực tế, tôi có hai tệp 90GB để sắp xếp, và sau đó tôi cần phải tìm chúng .... Có ý tưởng nào về phần khác không?
Xuezhou Zhang

@XuezhouZhang không phải không có thêm chi tiết, không. Tôi đề nghị bạn hỏi một câu hỏi mới. Hãy chắc chắn rằng bạn làm rõ liệu bạn cần biết sự khác biệt là gì hoặc nếu bạn chỉ cần biết liệu các tệp có khác nhau không, nhưng đừng quan tâm làm thế nào hoặc tại sao.
terdon

Liệu -bcác dòng Honorus, tức là để kích thước chunk tròn để phân chia trên breakbreak? Tôi không thể nhìn thấy bất cứ điều gì trong man split, tôi đang lo ngại nếu có thể được mong đợi xách tay về phía chia regaring dòng không phá vỡ ở giữa
Grzegorz Wierzowiecki

@GrzegorzWierzowiecki Tôi giả sử như vậy. sorthoạt động trên các dòng theo mặc định, toàn bộ khái niệm sắp xếp dựa trên các dòng sắp xếp , vì vậy nó phải tôn trọng các ranh giới dòng ở đây. Tôi đã không kiểm tra mã nguồn, nhưng đó là điều duy nhất có ý nghĩa.
terdon
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.