Điều này khiến tôi hoàn toàn bối rối.Trật tự lệnh PythonDự phú xạ so với dict()
asset_hist = []
for key_host, val_hist_list in am_output.asset_history.items():
for index, hist_item in enumerate(val_hist_list):
#row = collections.OrderedDict([("computer_name", key_host), ("id", index), ("hist_item", hist_item)])
row = {"computer_name": key_host, "id": index, "hist_item": hist_item}
asset_hist.append(row)
Mã này hoạt động hoàn hảo với dòng bộ sưu tập đã nhận xét. Tuy nhiên, khi tôi bình luận ra dòng = dòng dict và loại bỏ các bình luận từ các dòng bộ sưu tập thì mọi thứ trở nên rất lạ. Có khoảng 4 triệu trong số các hàng này được tạo và được thêm vào asset_hist.
Vì vậy, khi tôi sử dụng hàng = dict, toàn bộ vòng lặp kết thúc trong khoảng 10 mili giây, nhanh như chớp. Khi tôi sử dụng từ điển đặt hàng, tôi đã chờ hơn 10 phút và nó vẫn chưa kết thúc. Bây giờ, tôi biết OrderDict được cho là chậm hơn một chút so với một dict, nhưng nó được cho là chậm hơn khoảng 10 lần ở mức tồi tệ nhất và bởi toán của tôi thực sự chậm hơn khoảng 100.000 lần so với chức năng này.
Tôi quyết định in chỉ mục trong vòng lặp thấp nhất để xem điều gì đang xảy ra. Điều thú vị là, tôi nhận thấy một sự xuất hiện trong giao diện điều khiển. Chỉ số sẽ in rất nhanh trên màn hình và sau đó dừng lại trong khoảng 3-5 giây trước khi tiếp tục.
am_output.asset_history là một từ điển có một khóa, máy chủ và mỗi hàng là một danh sách các chuỗi. Ví dụ.
am_output.asset_history = {"host1": ["string1", "string2", ...], "host2": ["string1", "string2", ...], ...}
EDIT: Phân tích nổ lách tách với OrderedDict
Tổng số bộ nhớ trên máy chủ VM này: Chỉ 8GB ... cần để provissioned hơn.
LOOP NUM
184796 (~ 5 giây chờ đợi, ~ 60% sử dụng bộ nhớ)
634481 (~ 5 chờ đợi thứ hai, ~ 65% sử dụng bộ nhớ)
1197564 (~ 5 chờ đợi thứ hai , ~ 70% sử dụng bộ nhớ)
1899247 (~ 5 chờ đợi thứ hai, ~ 75% sử dụng bộ nhớ)
2777296 (~ 5 chờ đợi thứ hai, ~ 80% sử dụng bộ nhớ)
012.351.3873730 (LONG WAIT ... đã chờ 20 phút và đã ngừng sử dụng !, 88,3% mức sử dụng bộ nhớ, quá trình vẫn đang chạy)
Trường hợp việc chờ đợi xảy ra thay đổi theo từng lần chạy.
EDIT: Chạy lại lần nữa, lần này nó dừng lại trên 3873333, gần điểm dừng trước đó. Nó dừng lại sau khi hình thành hàng, trong khi cố gắng để nối thêm ... Tôi đã không nhận thấy nỗ lực cuối cùng này nhưng nó đã có sau đó quá ... vấn đề là với dòng append, không phải dòng hàng ... Tôi vẫn còn vách ngăn. Đây là hàng nó được sản xuất ngay trước điểm dừng dài (thêm hàng vào bản in) ... tên máy chủ đã thay đổi để bảo vệ người vô tội:
3873333: OrderedDict ([('computer_name', 'bg-fd5612ea'), ('id', 1), ('hist_item', "sys1 Normalizer (sys1-4): Tên miền không thể được xác định từ sys1 Name 'bg-fd5612ea'.")])
Tôi cảm thấy khó tin rằng những gì bạn đang quan sát là do hành vi 'dict' so với' OrderedDict', có thể điều gì đó đang thay đổi không? Tôi cũng nghĩ rằng ai đó sẽ đấu tranh để tái sản xuất này –
Vâng, họ sẽ cần phải tạo ra các từ điển lớn đầu tiên, có lẽ máy phát điện chuỗi ngẫu nhiên sẽ đủ tốt. Nhưng tôi hoàn toàn nghiêm túc, khi tôi di chuyển # xuống một dòng này xảy ra. Nó cũng đáng chú ý: khi nó bị mắc kẹt trong vòng lặp này khi sử dụng lệnh dict và tôi nhấn control + C để dừng vòng lặp, nó giống như không có gì xảy ra ... Tôi phải bấm control + Z để thoát ra. – gunslingor
Phiên bản Python nào? Trong phiên bản mới nhất, OrderedDict chỉ đơn giản là một bí danh cho dict, vì việc triển khai hiện tại xảy ra được sắp xếp theo chi tiết thực hiện. – RemcoGerlich