2011-09-03 62 views
0

我想解析每個類似於threadids的日誌文件。可以配置任意數量的線程。所有線程都寫入相同的日誌文件,我正在解析日誌文件併爲每個線程創建特定的新文件,以便稍後檢查它們。
下面我捕獲列表中的threadids。
下面的代碼是做這項工作,但我覺得這是不高效的。有什麼更快的嗎?更快地解析所有列表元素的文件,並根據列表元素分析到新文件

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

保留打開文件的列表,而不是每次在循環中調用打開 – jterrace

+0

有多少個threadids?幾千個同時打開的文件應該不是真正的問題(如果機器沒有被佔用)。 – extraneon

+1

use subprocess.call not os.system;它更安全。你也應該把'open(folderpath +「/」+ i +「.log」,「a +」)。write(line)'改成'open(os.path.join(folderpath,i +「.log」),一個+「)。寫(線)' – 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() 

如果你不能保持整個日誌文件在內存中,嘗試在其中您一次寫入每個文件一個一個多通道解決方案。

in_file = open(filetoopen) 
for i in sThdiD: 
    in_file.seek(0) # Reset the file to read from the beginning. 
    out_file = open(folderpath+"/"+i+".log", "w") 
    for line in in_file: 
    if i in line: 
     out_file.write(line) 
    out_file.close() 
in_file.close()