bạn muốn xây dựng một chỉ số trong bộ nhớ cho các tập tin:
- tạo ra một danh sách trống
open
file
- đọc nó từng dòng (sử dụng
f.readline()
, và lưu trữ trong danh sách một bộ bao gồm giá trị mà bạn muốn sắp xếp (được trích xuất với line.split('\t').strip()
) và độ lệch của dòng trong tệp (mà bạn có thể nhận được bằng cách gọi f.tell()
trước khi gọi f.readline()
)
close
file
sort
danh sách
Sau đó, để in các tập tin được sắp xếp, mở lại tập tin và cho mỗi phần tử của danh sách, sử dụng f.seek(offset)
để di chuyển con trỏ tập tin đến đầu dòng, f.readline()
đọc dòng và print
dòng.
Tối ưu hóa: bạn có thể muốn lưu trữ độ dài của dòng trong danh sách, để bạn có thể sử dụng f.read(length)
trong giai đoạn in.
Mẫu mã (tối ưu hóa cho dễ đọc, không phải tốc độ):
def build_index(filename, sort_col):
index = []
f = open(filename)
while True:
offset = f.tell()
line = f.readline()
if not line:
break
length = len(line)
col = line.split('\t')[sort_col].strip()
index.append((col, offset, length))
f.close()
index.sort()
return index
def print_sorted(filename, col_sort):
index = build_index(filename, col_sort)
f = open(filename)
for col, offset, length in index:
f.seek(offset)
print f.read(length).rstrip('\n')
if __name__ == '__main__':
filename = 'somefile.txt'
sort_col = 2
print_sorted(filename, sort_col)
Nguồn
2011-08-16 14:23:44
lệnh sắp xếp unix là một công cụ rất mạnh mẽ thực sự. Bạn có thể kiểm soát định dạng của trường để sắp xếp (số, ngày, v.v.) và lượng bộ nhớ mà chương trình có thể phân bổ, thực hiện phân tách + hợp nhất sắp xếp nếu cần. –
alex bạn có thể đưa ra một ví dụ không? Chương trình sắp xếp theo cách riêng của nó mất khá nhiều thời gian ... trong khoảng 40 phút. Điều này có thể có một cái gì đó để làm với phân bổ bộ nhớ hoặc đĩa IO. Tôi không chắc chắn làm thế nào để tìm ra những nút cổ chai là gì, nhưng tôi đoán rằng đề xuất của bạn có thể hữu ích. – fodon
một lỗi trong giải pháp ở trên: chỉ sử dụng trường thứ 2, một nhu cầu -k 2,2 ... vì vậy nó không được lập chỉ mục (ít nhất là không có trên phiên bản sắp xếp của Kubuntu 11.04). – fodon