これは私には完全に困惑しています。PythonのOrderDictと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)
このコードはコメントアウトコレクションラインと完璧に動作します。しかし、私が行= dict行をコメントアウトし、コレクションの行からコメントを削除すると非常に奇妙になります。これらの行は約400万個生成され、asset_histに追加されます。
したがって、私がrow = dictを使用すると、ループ全体が約10ミリ秒で終了し、雷が速くなります。順序付き辞書を使用すると、10分以上待っていますが、まだ終了していません。さて、私はOrderDictがdictより少し遅いと思われていることを知っていますが、最悪の場合は約10倍遅く、この関数では実際に約10万倍遅くなります。
私は何が起こっていたかを見るために、最も低いループでインデックスを印刷することに決めました。面白いことに、私はコンソール出力でスパッタリングに気づいた。インデックスは画面上で非常に速く印刷され、約3-5秒間停止してから続行します。
am_output.asset_historyは、1つのキーhostを持ち、すべての行が文字列のリストである辞書です。例えば。
am_output.asset_history = {"host1":["string1"、 "string2"、...]、 "host2":["string1"、 "string2"、...]、...}
EDIT:OrderedDict
合計メモリとスパッタ解析このVM Server上:のみ8ギガバイト...続きprovissioned取得する必要があります。
LOOP NUM
184796(約5秒待ち、〜60%のメモリ使用量)
634481(約5秒待ち、〜65%のメモリ使用量)
1197564(〜5秒待機、〜70%のメモリ使用量)
1899247(〜5秒待ち、〜75%メモリ使用量)
2777296(〜5秒待ち、〜80%のメモリ使用量)
3873730(LONG WAITは... 20分を待って!、88.3パーセントのメモリ使用量、プロセスがまだ実行されているあきらめた)待ち時間が各実行で変更をたまたま
を。
EDIT:これをもう一度実行してください。今回は停止する前に停止した場所に3873333で停止します。それは行を形成した後に追加しようとしている間に停止しました...私はこの最後の試みに気づいていませんでしたが、それもそこにありました...問題は行の行ではなく行の行にあります...私はまだですうんざりするここでは、長いストップの直前に作成された行(print文に行を追加したもの)があります。ホスト名は無実を保護するために変更されました:
3873333:OrderedDict([( 'computer_name'、 'bg-fd5612ea' )]))
あなたが観察していることが 'dict'と' OrderedDict'の振る舞いであると信じるのは難しいです。誰かがこれを再現するのに苦労するだろうと思う。 –
ええ、巨大な辞書を最初に生成する必要があります。おそらくランダムな文字列ジェネレータで十分です。しかし、私はまったく真剣です。私は#を1行下に移動するとこれが起こります。順序付き辞書を使用しているときにこのループに詰まっていて、ループを停止するためにCtrl + Cキーを押すと、何も起こりません。Ctrl + Zキーを押す必要があります。 – gunslingor
どのPythonのバージョンですか?最新のOrderedDictは単にdictのエイリアスです。現在の実装は実装の詳細によって順序付けされているためです。 – RemcoGerlich