Một tệp văn bản khổng lồ (tối đa 2 GiB) của tôi chứa khoảng 100 bản sao chính xác của mỗi dòng trong đó (vô dụng trong trường hợp của tôi, vì tệp là một bảng dữ liệu giống như CSV).
Những gì tôi cần là loại bỏ tất cả các lần lặp lại trong khi (tốt nhất là, nhưng điều này có thể được hy sinh để tăng hiệu suất đáng kể) duy trì thứ tự trình tự ban đầu. Trong kết quả, mỗi dòng là duy nhất. Nếu có 100 dòng bằng nhau (thường là các bản sao được trải đều trên tệp và sẽ không là hàng xóm) thì chỉ còn một dòng duy nhất.
Tôi đã viết một chương trình bằng Scala (coi đó là Java nếu bạn không biết về Scala) để thực hiện điều này. Nhưng có lẽ có những công cụ bản địa viết C nhanh hơn có thể làm điều này nhanh hơn?
CẬP NHẬT: awk '!seen[$0]++' filename
giải pháp có vẻ hoạt động tốt đối với tôi miễn là các tệp gần 2 GiB hoặc nhỏ hơn nhưng bây giờ tôi đang dọn sạch tệp 8 GiB thì nó không còn hoạt động nữa. Có vẻ như mất vô hạn trên máy Mac với RAM 4 GiB và PC Windows 7 64 bit với RAM 4 GiB và 6 GiB trao đổi vừa hết bộ nhớ. Và tôi không cảm thấy hào hứng khi thử nó trên Linux với RAM 4 GiB cho trải nghiệm này.
sort -u
có lẽ sẽ nhanh hơn