Python file.write 随着输出文件变大而变慢

标签 python file-io python-2.7 windows-server-2008-r2

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

这是写入输出文件的方法。我将写入部分从单独的方法移至内联:

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将大文件分割成记录。 Infiles 为 5-21 MB。

请告知在哪里查找错误。 当我谈到速度减慢时,写入速度在写入大约 1 MB 后下降到每秒 4KB 写入以下,并且随着输出文件变大,写入速度不断下降。

编辑:根据要求,这里是 parse_infile 和 _file_stripper:

def parse_infile(f_in):
   index = ""     #variabel som håller vilken ondemandvariabel vi läser in
   found_data = 0  #1 ifall vi hittat det vi letar efter annars 0
   for row in f_in:
      if( 'personnr' in row):
         found_data=1
         index = "personnr"
      elif( 'kundid_gdb' in row):
         found_data=1
         index = "kundid_gdb"
      elif( 'brevid_kalla' in row):
         found_data=1
         index = "brevid_kalla"
      elif( 'arkiveringsdatum' in row):
         found_data=1
         index = "arkiveringsdatum"
      elif( 'GROUP_FILENAME' in row ):
         variable_data['dokumenttyp'] = row.split(':')[-1].split('.')[2].capitalize()
      elif(found_data==1):
         variable_data[index] = row.split(':')[1].strip() 
         index = ""  #Nollställ index ifall värden saknas i filen
         found_data=0
      else:
         pass

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

variable_data = { "brevid_kalla": "", "arkiveringsdatum": "", 
          "kundid_gdb": "", "personnr": "",
          "dokumenttyp": "" }

最佳答案

最有可能发生的情况是您的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)
    (...)

关于Python file.write 随着输出文件变大而变慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14277174/

相关文章:

python - 使用 python2.7 和 nltk 将代词替换为其先行词

python - 什么可能导致 MySQL 挂起我的 Python 脚本?

python - 当 expanded_url 不够时在 Tweepy 中完成 url(与 urllib2 集成?)

Python正则表达式查找与其他单词分隔的单词

c - 如何读取文件和分离值

c - 在 C 中,追加到打开的文件以供 Windows 控制台和 Linux 上的另一个程序读取

python - 有没有更 pythonic 的方法来为一个类设置多个默认参数?

python - Kivy - 为选项卡按钮添加图标

c++ - WriteFile 到串口总是超时,写入的字节数为零

python - str.split (' ' ) 给我 "ValueError: empty separator"一个字符串形式的句子