Python文件.写入当输出文件变大时速度变慢

2024-10-05 10:46:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我对Python很陌生,但我有一个很痛苦的问题。 我收到一个程序,它读取一个内嵌(文本),更改一些值,并写入一个输出文件(也包括文本)。 随着输出文件越来越大,写入速度越来越慢,在大约2MB之后,它的速度慢得令人无法忍受。 为什么会这样?我尝试过改变代码以使用不同大小的缓冲区,并且在编写之前将数据缓存到更大的块(字符串)中。我还尝试用join而不是+=来创建要写入的字符串。这些对性能没有任何影响,除了写更大的块,这实际上使代码变慢。(!!!)在

下面是编写输出文件的方法。我将write部分从一个单独的方法移到inline:

for ifile in _file_stripper(f_in):
    parse_infile(ifile)
    date = variable_data['arkiveringsdatum']
    variable_data['arkiveringsdatum'] = datetime( int(date[0:4]), int(date[4:6]), int(date[6:8]), tzinfo=TZ()).isoformat('T')
    _personnr= variable_data['personnr'].replace('-', '').split(' ')[0]
    tmplist = ['<utskriftsstatus><brevid_kalla>', variable_data['brevid_kalla'], '</brevid_kalla><mapp>Se Allt</mapp><tidpunkt>', variable_data['arkiveringsdatum'], '</tidpunkt><dokumentpaket>', variable_data['dokumenttyp'], '</dokumentpaket><status>Utskriven</status><rensningsdatum>999999</rensningsdatum><kundid_gdb>', variable_data['kundid_gdb'], '</kundid_gdb><personnr>', _personnr, '</personnr></utskriftsstatus>']
    f_out.write(''.join(tmplist))

方法_file_stripper将大文件拆分为记录。 填充为5-21 MB。在

请建议在哪里查找错误。 当我谈到减速时,在大约1MB被写入后,写入速度会下降到4KB/秒以下,并且随着输出文件的增大,写入速度会不断下降。在

编辑:根据要求,这里是parse_infile和\u file_stripper:

^{pr2}$

Tags: 文件方法datadatevariable速度fileint
2条回答

最有可能的情况是,variable_data,或者更可能是其中的某些字段,随着每个解析的文件而增长。在

您的parse_infile函数可能没有重置它,并将新文件的值附加到已存在的值上,使其在每次读取文件时变大-这将导致(O²)中使用资源,如您所述。在

最好的做法是不要依赖全局变量—让您的parse_infile函数为每个交互创建一个新的字典,并将其返回给调用方。在主函数上,将函数的返回值指定给字典:

def parse_infile(file_):
    variable_data = {}
    (...)
    return variable_data

(...)
for ifile in _file_stripper(f_in):
    variable_data = parse_infile(ifile)
    (...)

您的_file_stripper函数将无休止地添加到myfile列表中,而不必重置列表:

def _file_stripper(tot_file):
   try:
      myfile = []
      for rows in tot_file:
         if not 'GROUP_FILENAME' in rows:
            myfile.append(rows)
         else:
            myfile.append(rows)
            yield myfile
   except Exception:
      pass

请注意,myfile是在循环之外设置的,每一行都以myfile为前缀,然后按原样生成。因此,进程内存占用将不断增长,迫使操作系统最终开始交换内存,从而使进程缓慢爬行。在

我想你是想重置myfile,而GROUP_FILENAME没有出现在rows中:

^{pr2}$

相关问题 更多 >

    热门问题