2011-09-03 2 views
0

모든 경우에 threadids로 로그 파일을 구문 분석하려고합니다. 구성 할 수있는 스레드 수에는 제한이 없습니다. 모든 스레드는 동일한 로그 파일에 쓰고 나중에 검사하기 위해 로그 파일을 구문 분석하고 각 스레드에 고유 한 새 파일을 작성합니다.
아래 목록에서 스레드 ID를 캡처하고 있습니다.
아래 코드는 작업을 수행하고 있지만 이것이 효율적이지 않다고 생각합니다. 더 빠른 것이있을 수 있습니까? 당신이 메모리에 전체 로그 파일을 넣을 수 가정모든 목록 요소에 대해 파일을 더 빨리 구문 분석하고 목록 요소를 기반으로 새 파일을 보냄

sThdiD = ["abc", "cde\"efg"] 
folderpath = "newdir" 
os.system("mkdir " + folderpath) 
for line in open(filetoopen): 
    for i in sThdiD: 
     if i in line: 
      open(folderpath+"/"+i+".log","a+").write(line) 
+2

루프마다 매번 open을 호출하는 대신 열려있는 파일 목록을 유지하십시오. – jterrace

+0

threadid는 몇 개입니까? 한 번에 수천 개의 열린 파일이 실제로 문제가되어서는 안됩니다 (시스템이 다르게 사용되지 않는 경우). – extraneon

+1

subprocess.call은 os.system이 아닙니다. 더 안전합니다. 또한 실제로 open (folderpath + "/"+ i + ". log", "a +"). write (line)'을'open (os.path.join (folderpath, i + ".log") " a + "). write (line)' – Ben

답변

1

, 나는 스레드에 의해 쓰여진 라인에 사전 매핑 스레드 ID를 유지 한 다음 마지막에 전체 파일을 쓰는 것입니다.

thread_map = {} # keys are thread IDs; values are lists of log lines 
for line in open(filetoopen): 
    for i in sThdiD: 
    if i in line: 
     if i not in thread_map: 
     thread_map[i] = [] 
     thread_map[i].append(line) 

for key in thread_map: 
    f = open(folderpath+"/"+key+".log", "w") 
    for line in thread_map[key]: 
    f.write(line) 
    f.close() 

전체 로그 파일을 메모리에 보관할 수없는 경우 한 번에 하나씩 각 파일을 기록하는 다중 패스 솔루션을 사용해보십시오.

관련 문제