Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
随着输出文件变大,Python file.write的速度变慢_Python_File Io_Python 2.7_Windows Server 2008 R2 - Fatal编程技术网

随着输出文件变大,Python file.write的速度变慢

随着输出文件变大,Python file.write的速度变慢,python,file-io,python-2.7,windows-server-2008-r2,Python,File Io,Python 2.7,Windows Server 2008 R2,我对Python非常陌生,但我有一个棘手的问题。 我收到一个程序,它读取一个内嵌(文本),更改一些值,并写入一个输出文件(也是文本)。 随着输出文件越来越大,写入速度越来越慢,在大约2MB之后,速度变得难以忍受。 为什么会这样?我尝试修改代码以使用不同大小的缓冲区,并在编写之前将数据缓存到更大的块(字符串)中。我还尝试了join而不是+=来创建要写入的字符串。所有这些都不会对性能产生任何影响——除了编写更大的代码块,这实际上会降低代码的速度。(!!!) 下面是写入输出文件的方法。我将写入部分从单

我对Python非常陌生,但我有一个棘手的问题。 我收到一个程序,它读取一个内嵌(文本),更改一些值,并写入一个输出文件(也是文本)。 随着输出文件越来越大,写入速度越来越慢,在大约2MB之后,速度变得难以忍受。 为什么会这样?我尝试修改代码以使用不同大小的缓冲区,并在编写之前将数据缓存到更大的块(字符串)中。我还尝试了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))

最有可能发生的情况是,您的
变量\u数据
,或者更可能是其中的一些字段,随着每个解析文件而增长

您的
parse_infle
函数很可能没有重置它,并且没有将新文件的值附加到已有的值中,这使得每次读取文件时,新文件的值都会变大—这将导致在(O²)中使用您所描述的资源

最好的做法是不要依赖全局变量——让你的
parse\u infle
函数在每次交互中创建一个新的字典,并将它返回给调用者。在主函数上,将函数的返回值指定给字典:

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

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

最有可能发生的情况是,您的
变量\u数据
,或者更可能是其中的一些字段,随着每个解析文件而增长

您的
parse_infle
函数很可能没有重置它,并且没有将新文件的值附加到已有的值中,这使得每次读取文件时,新文件的值都会变大—这将导致在(O²)中使用您所描述的资源

最好的做法是不要依赖全局变量——让你的
parse\u infle
函数在每次交互中创建一个新的字典,并将它返回给调用者。在主函数上,将函数的返回值指定给字典:

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

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

您的
\u file\u 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
,然后按原样生成。因此,您的进程内存占用将不断增长,迫使操作系统最终开始交换内存,从而将进程拖慢到爬行状态

组文件名
没有出现在
行中时,我想您是想重置
我的文件

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
            myfile = []
   except Exception:
      pass

您的
\u file\u 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
,然后按原样生成。因此,您的进程内存占用将不断增长,迫使操作系统最终开始交换内存,从而将进程拖慢到爬行状态

组文件名
没有出现在
行中时,我想您是想重置
我的文件

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
            myfile = []
   except Exception:
      pass

我忘了提到,我当然尝试了file.open作为带有“w”和“a”的输出文件。没有区别。您可以将您的问题添加到更多详细信息中。您可以向我们展示
\u file\u stripper()
parse\u infle()
的定义吗?输入数据在记录中,每条记录有固定数量的行,数据在FIELDNAME字段值对中查找。您是否希望每个文件中只有五条记录?否则,parse_infle的逻辑似乎是错误的。我忘了提到,我当然尝试了file.open作为带有“w”和“a”的输出文件。没有区别。您可以将您的问题添加到更多详细信息中。您可以向我们展示
\u file\u stripper()
parse\u infle()
的定义吗?输入数据在记录中,每条记录有固定数量的行,数据在FIELDNAME字段值对中查找。您是否希望每个文件中只有五条记录?否则parse_infle的逻辑看起来可能是错误的。@LJB:如果这是您的实际代码,我非常肯定它是错误的。:-)我只想确认这确实起了作用。我告诉了代码的作者,myfile实际上是一个生成器。他后来更改了代码,忘记了根据需要初始化代码。非常感谢你帮我找到它!现在,如果有一个很好的方法将这个问题标记为“已解决”,请这样做。。。它不在FAQ、AFAICS中:D@LJB:看起来你已经明白了。:-)它在“如何提问”部分。@LJB:如果这是您的实际代码,我非常肯定它是。:-)我只想确认这确实起了作用。我告诉了代码的作者,myfile实际上是一个生成器。他后来更改了代码,忘记了根据需要初始化代码。非常感谢你帮我找到它!现在,如果有一个很好的方法将这个问题标记为“已解决”,请这样做。。。它不在FAQ、AFAICS中:D@LJB:看起来你已经明白了。:-)它位于本手册的“如何提问”部分。