Tôi đã một dịch vụ chạy mà phải mất một danh sách khoảng 1.000.000 từ điển và thực hiện những điều sauCách tốt nhất để sắp xếp hồ sơ 1M bằng Python
myHashTable = {}
myLists = { 'hits':{}, 'misses':{}, 'total':{} }
sorted = { 'hits':[], 'misses':[], 'total':[] }
for item in myList:
id = item.pop('id')
myHashTable[id] = item
for k, v in item.iteritems():
myLists[k][id] = v
Vì vậy, nếu tôi đã có danh sách sau đây của các từ điển:
[ {'id':'id1', 'hits':200, 'misses':300, 'total':400},
{'id':'id2', 'hits':300, 'misses':100, 'total':500},
{'id':'id3', 'hits':100, 'misses':400, 'total':600}
]
tôi kết thúc với
myHashTable =
{
'id1': {'hits':200, 'misses':300, 'total':400},
'id2': {'hits':300, 'misses':100, 'total':500},
'id3': {'hits':100, 'misses':400, 'total':600}
}
và
myLists =
{
'hits': {'id1':200, 'id2':300, 'id3':100},
'misses': {'id1':300, 'id2':100, 'id3':400},
'total': {'id1':400, 'id2':500, 'id3':600}
}
Sau đó, tôi cần sắp xếp tất cả dữ liệu trong mỗi từ điển myLists.
Những gì tôi đang làm là một cái gì đó như sau:
def doSort(key):
sorted[key] = sorted(myLists[key].items(), key=operator.itemgetter(1), reverse=True)
which would yield, in the case of misses:
[('id3', 400), ('id1', 300), ('id2', 200)]
này hoạt động tuyệt vời khi tôi đã lên đến 100.000 hồ sơ hoặc lâu hơn, nhưng với 1.000.000 nó được tham gia ít nhất 5 - 10 phút để sắp xếp mỗi tổng cộng 16 (danh sách ban đầu của tôi về từ điển thực sự có 17 lĩnh vực bao gồm id được popped)
* EDIT * dịch vụ này là một ThreadingTCPServer trong đó có một phương pháp cho phép một khách hàng để kết nối và thêm 01.dữ liệu mới. Các dữ liệu mới có thể bao gồm kỷ lục mới (có nghĩa là từ điển với độc đáo 'id của những gì đã có trong bộ nhớ ) hoặc hồ sơ sửa đổi (nghĩa cùng 'id' với dữ liệu khác nhau cho các cặp giá trị quan trọng khác
Vì vậy, , lần này đang chạy tôi sẽ vượt qua trong
[ {'id':'id1', 'hits':205, 'misses':305, 'total':480}, {'id':'id4', 'hits':30, 'misses':40, 'total':60}, {'id':'id5', 'hits':50, 'misses':90, 'total':20 ]
tôi đã được sử dụng từ điển để cửa hàng dữ liệu vì vậy mà tôi không kết thúc với bản sao. Sau khi điển được cập nhật với dữ liệu mới/sửa đổi Tôi sử dụng mỗi chúng.
* END EDIT *
Vì vậy, cách tốt nhất đối với tôi để sắp xếp này là gì? Có phương pháp nào tốt hơn không?
Đây có lẽ không phải là câu trả lời bạn đang tìm kiếm, nhưng việc sử dụng Python thuần túy để xử lý khối lượng dữ liệu đó không phải là một ý tưởng hay nói chung. Nó không được thiết kế để thực hiện khi bạn cần thực hiện rất nhiều hoạt động nhỏ (chẳng hạn như, tốt, so sánh trong quá trình phân loại). –
@Pavel, bạn đã sai: Sắp xếp của Python (timsort) có lẽ là loại sắp xếp trong bộ nhớ nhanh nhất có sẵn. Josh Bloch thấy nó giải thích tại một cuộc nói chuyện công nghệ tại Google và ngay lập tức bắt đầu mã hóa nó như là loại nội bộ cho phiên bản Java tiếp theo; xem http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6804124 và http://svn.python.org/projects/python/trunk/Objects/listsort.txt –
@alex, Bạn có biết nói chuyện công nghệ? Không phải là tôi nghi ngờ bạn. Nó chỉ đạt được sự quan tâm của tôi. :) –