如何加速(并行化?)文本文件编辑?

时间:2014-09-29 16:09:24

标签: python io

我有一个脚本,如果它具有某种模式,则删除第二行。但是,当在包含数百个文件的文件夹上运行它很慢时,我必须等待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))

2 个答案:

答案 0 :(得分:1)

您可能是磁盘绑定的,但是您可以通过执行更大的块复制来稍微收紧代码。而不是readlines / writelines,手动处理前两行,然后将其转换为shutil用于其余部分。

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并查看时间是否相同来查看是否受磁盘限制。如果您有多个硬盘驱动器,则应确保中间文件位于同一驱动器上。

答案 1 :(得分:0)

查看multiprocessing模块。例如,您可以使用Pool并行地在文件列表上映射函数:

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

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