2014-09-29 54 views
0

我有一个脚本,删除第二行,如果它有一个特定的模式。然而,当在包含数百个文件的文件夹上运行时,它非常慢,我必须等待5分钟左右才能完成。因为它是I/O我相信有一种方法可以加速或并行化你知道吗?这里是目前缓慢代码:如何加速(并行化)文本文件的编辑?

import datetime as dt 
import os, re 

for symb in os.listdir(r'C:\folder'): 

    n1=dt.datetime.now() 

    fh, abs_path = mkstemp() 

    new_file = open(abs_path,'w') 

    file_path = r'C:\folder' + '\\' + symb 

    print(repr(file_path)) 

    old_file = open(file_path, 'r') 
    new_file = open(abs_path, 'w') 

    data = old_file.readlines() 


    if re.match('9:', data[1]): 
     print('YES') 
     del data[1] 

    for line in data : 
     new_file.write(line) 

    new_file.close() 
    close(fh) 
    old_file.close() 


    remove(file_path) 

    move(abs_path, file_path) 

    print(symb + ' : ' + str((dt.datetime.now()-n1).microseconds)) 

回答

0

看看到multiprocessing模块。例如,你可以使用Pool映射在文件列表中选择一个功能并行:

from multiprocessing import Pool 
p = Pool(5) 
def doIt(x): 
    # do the thing 

p.map(doIt, os.listdir(r'C:\folder')) 
1

你很可能盘的约束,但你可以做更大的块复制收紧代码位。而不是readlines/writelines,手动处理前两行,然后将其翻过来以便休息。

import shutil 

.... 

    line1 = oldfile.readline() 
    line2 = oldfile.readline() 
    if re.match('9:', line2): 
     line2 = '' 
    newfile.write(line1 + line2) 
    shutil.copyfileobj(old_file, new_file, length=1024*1024) 

通过对所有文件进行xcopy并查看时间是否差不多,您可以看到是否磁盘绑定。如果您有多个硬盘驱动器,则应确保中间文件位于同一个驱动器上。