Tôi có tệp csv mà tôi muốn xóa các hàng trùng lặp, nhưng nó quá lớn để vừa với bộ nhớ. Tôi đã tìm ra cách để hoàn thành nó, nhưng tôi đoán đó không phải là cách tốt nhất.Xóa các hàng trùng lặp khỏi một tệp lớn trong Python
Mỗi hàng chứa 15 trường và vài trăm ký tự và tất cả các trường là cần thiết để xác định tính duy nhất. Thay vì so sánh toàn bộ hàng để tìm một bản sao, tôi so sánh hash(row-as-a-string)
để tiết kiệm bộ nhớ. Tôi đặt một bộ lọc phân vùng dữ liệu thành một số hàng gần bằng nhau (ví dụ: ngày trong tuần) và mỗi phân vùng đủ nhỏ để bảng tra cứu giá trị băm cho phân vùng đó sẽ vừa với bộ nhớ. Tôi đi qua các tập tin một lần cho mỗi phân vùng, kiểm tra đối với hàng độc đáo và viết chúng ra vào một tập tin thứ hai (pseudo code):
import csv
headers={'DayOfWeek':None, 'a':None, 'b':None}
outs=csv.DictWriter(open('c:\dedupedFile.csv','wb')
days=['Mon','Tue','Wed','Thu','Fri','Sat','Sun']
outs.writerows(headers)
for day in days:
htable={}
ins=csv.DictReader(open('c:\bigfile.csv','rb'),headers)
for line in ins:
hvalue=hash(reduce(lambda x,y:x+y,line.itervalues()))
if line['DayOfWeek']==day:
if hvalue in htable:
pass
else:
htable[hvalue]=None
outs.writerow(line)
Một cách tôi đã suy nghĩ để tăng tốc độ này lên được bằng cách tìm một bộ lọc tốt hơn để giảm số lượng đường chuyền cần thiết. Giả sử chiều dài của các hàng được phân bố đều, có lẽ thay vì
for day in days:
và
if line['DayOfWeek']==day:
chúng tôi có
for i in range(n):
và
if len(reduce(lambda x,y:x+y,line.itervalues())%n)==i:
nơi 'n' như nhỏ như bộ nhớ sẽ cho phép. Nhưng điều này vẫn còn sử dụng cùng một phương pháp.
Wayne Werner cung cấp giải pháp thiết thực tốt bên dưới; Tôi đã tò mò nếu có cách tốt hơn/nhanh hơn/đơn giản hơn để thực hiện điều này từ góc độ thuật toán.
P.S. Tôi bị giới hạn ở Python 2.5.
Các hàng đầu ra của bạn có cần theo thứ tự giống như trong tệp đầu vào hay không ? Bạn có mong đợi nhiều lần lặp lại hay kích thước của tệp đầu ra sẽ giữ được nhiều hoặc ít hơn cùng một mức độ lớn như của tệp đầu vào (hoặc không thể dự đoán được)? – rbp
Thứ tự của các hàng trong tệp đầu ra không quan trọng. Đối với trường hợp cụ thể này có tương đối ít bản sao. Bạn có nghĩ số lượng bản sao có mang trong trường hợp chung không? Ví dụ: – JonC
Ví dụ: các hàng duy nhất có thể vừa với bộ nhớ (ngay cả khi tệp đầy đủ, trùng lặp, sẽ không). Tôi phải đi một lúc, nhưng tôi sẽ đưa ra gợi ý sau. – rbp