我对 Python 很陌生,但我有一个痛苦的问题。我收到了一个程序,它读取一个 infile(文本),更改一些值,并写入一个 outfile(也是文本)。随着 outfile 变得越来越大,写入变得越来越慢,在大约 2 MB 之后变得难以忍受。为什么会这样?我已尝试更改代码以使用不同大小的缓冲区,并且我已将其更改为在写入之前将数据缓存到更大的块(字符串)中。我还尝试了 join 而不是 += 来创建要写入的字符串。这些都对性能没有任何影响-除了编写更大的块,这实际上使代码变慢了。(!!!)
这是写入输出文件的方法。我将写入部分从单独的方法移至内联:
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 以下,并且随着 outfile 变大而不断下降。
编辑:根据要求,这里是 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": "" }