私は1年間書いてきた大規模な30kラインプログラムを持っています。基本的には、複数のソースから正規化されていないデータと標準化されていないデータを収集し、ソースを標準化した後にすべてを照合します。私の中毒をPython辞書に切り込む方法
ほとんどのものは順序付き辞書で書いています。これにより、列の順序、名前、可変性を保つことができ、コードの混乱の中で値を割り当て/固定することができるため、処理が容易になりました。
しかし、私は現在、これらすべての辞書からRAMを使い果たしています。私は以来、namedtuplesへの切り替えがこれを修正することを学んだが、唯一の問題はこれらは変更可能ではないことで、変換を行う際に1つの問題が生じることです。
私はクラスを使用して不変性を排除することができると思いますが、RAM節約は同じになるでしょうか?もう一つの選択肢は、値を変更する必要があるたびに(つまり、NewTup = Tup(oldTup.odj1、oldTup.odj2、 "something new"))名前付きタプルを使用して新しい名前付きトゥープルに再割り当てすることです。
最後の行は私の入力ファイルはディスク(大量のデータ)の約6GBです。私はこのデータを16GB RAMのサーバで処理することを余儀なくされています私はもともとこれらのさまざまなI/Oデータセットのすべての行を辞書でプログラミングしていましたが、これはあまりにも多くのRAMを食べています...しかし、可変性と名前付き参照は高速開発で大きな助けとなりました私は辞書に加えて、アプリケーション全体をタプルの不変な性質に書き換えることなく、他のオブジェクトのコスト節約を利用できるようにしました。
サンプルコードは:
for tan_programs_row in f_tan_programs:
#stats not included due to urgent need
tan_id = tan_programs_row["Computer ID"].strip() #The Tanium ID by which to reference all other tanium files (i.e. primary key)
if("NO RESULT" not in tan_id.upper()):
tan_programs_name = tan_programs_row["Name"].strip() #The Program Name
tan_programs_publisher = tan_programs_row["Publisher"].strip() #The Program Vendor
tan_programs_version = tan_programs_row["Version"].strip() #The Program Vendor
try:
unnorm_tan_dict[tan_id] #test the key, if non-existent go to exception
except KeyError:
#form the item since it doesn't exist yet
unnorm_tan_dict[tan_id] = {
"Tanium ID": tan_id,
"Computer Name": "INDETERMINATE",
"Operating System": "INDETERMINATE",
"Operating System Build Number": "INDETERMINATE",
"Service Pack": "INDETERMINATE",
"Country Code": "INDETERMINATE",
"Manufacturer": "INDETERMINATE",
"Model": "INDETERMINATE",
"Serial": "INDETERMINATE"
}
unnorm_tan_prog_list.append(rows.TanRawProg._make([tan_id, tan_programs_name, tan_programs_publisher, tan_programs_version]))
for tan_processes_row in f_tan_processes:
#stats not included due to urgent need
tan_id = tan_processes_row["Computer ID"].strip() #The Tanium ID by which to reference all other tanium files (i.e. primary key)
if("NO RESULT" not in tan_id.upper()):
tan_process_name = tan_processes_row["Running Processes"].strip() #The Program Name
try:
unnorm_tan_dict[tan_id] #test the key, if non-existent go to exception
except KeyError:
#form the item since it doesn't exist yet
unnorm_tan_dict[tan_id] = {
"Tanium ID": tan_id,
"Computer Name": "INDETERMINATE",
"Operating System": "INDETERMINATE",
"Operating System Build Number": "INDETERMINATE",
"Service Pack": "INDETERMINATE",
"Country Code": "INDETERMINATE",
"Manufacturer": "INDETERMINATE",
"Model": "INDETERMINATE",
"Serial": "INDETERMINATE"
}
unnorm_tan_proc_list.append(rows.TanRawProc._make([tan_id, tan_process_name]))
*その後、これらの値には、多くの場合、他のデータセットを持ち込むことによって変更されています。
dictsメモリの使用量を減らすと、これまでのところより多くのデータが追加されたり、同じサーバー上にメモリを摂取している別のプロセスがあり、メモリの問題が再び発生します。本当に問題を解決したいのであれば、大量のデータをRAMにロードする必要のないソリューションが必要です(適切なデータベース - より強固な関係かどうかは、ソリューションの一部であるかもしれません)。 –