그래서 저는 1 년 동안 쓰고있는 30k 라인 프로그램을 가지고 있습니다. 기본적으로 비 정규화 된 데이터와 표준화되지 않은 데이터를 여러 소스에서 모으고 소스를 표준화 한 후 모든 것을 일치시킵니다.내 중독성을 파이썬 사전으로 자르는 방법
나는 모든 것을 주문 된 사전으로 작성했습니다. 이것은 열을 이름 붙이고 변경 가능하게 유지할 수있게하여 코드가 엉망진창에 걸쳐 값을 할당/수정할 수 있으므로 처리가 쉬워졌습니다.
그러나 현재 모든 사전에서 RAM이 부족합니다. 이후 namedtuples로 전환하면 문제가 해결된다는 것을 배웠습니다. 유일한 문제는 이러한 변경이 가능하지 않기 때문에 변환을 수행 할 때 한 가지 문제가 발생한다는 것입니다.
나는 불변성을 제거하기 위해 클래스를 사용할 수 있다고 믿지만, RAM 절감은 동일 할 것인가? 또 다른 옵션은 namedtuples을 사용하고 값을 변경할 필요가있을 때마다 새로운 namedtouples에 다시 할당하는 것입니다 (예 : NewTup = Tup (oldTup.odj1, oldTup.odj2, "something new"). 그러나 나는 명시적인 방법이 필요하다고 생각합니다. 그 이후의 오래된 파일이나 공간을 다시 파괴 할 수 있습니다.
결론적으로 필자의 입력 파일은 디스크 (많은 양의 데이터)에 대해 약 6GB입니다.이 데이터를 16GB RAM이 장착 된 서버에서 처리해야합니다. 및 4 GB 스왑. 원래 여러 가지 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 메모리 사용량을 줄이면 지금까지는 더 많은 데이터가 추가되거나 다른 프로세스에서 동일한 서버에 메모리를 사용하게되어 메모리 문제가 다시 발생합니다. 정말로 문제를 해결하려면 램에 많은 데이터를로드 할 필요가없는 솔루션이 필요합니다 (적절한 데이터베이스 - 관계형 또는 비 관계형 -이 솔루션의 일부일 수 있음). –