Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.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 文件I/O代码逐渐变慢_Python_File_File Io - Fatal编程技术网

Python 文件I/O代码逐渐变慢

Python 文件I/O代码逐渐变慢,python,file,file-io,Python,File,File Io,我已经编写了解析大量电子邮件(640000个文件)的代码,输出是带有特定日期的电子邮件文件名列表。代码如下: def createListOfFilesByDate(): searchDates = ["12 Mar 2012","13 Mar 2012"] outfile = "EmailList.txt" sent = "Sent:" fileList=glob.glob("./Emails/*.txt") foundDate = Fal

我已经编写了解析大量电子邮件(640000个文件)的代码,输出是带有特定日期的电子邮件文件名列表。代码如下:

def createListOfFilesByDate():

    searchDates = ["12 Mar 2012","13 Mar 2012"]
    outfile = "EmailList.txt"    
    sent = "Sent:"

    fileList=glob.glob("./Emails/*.txt")

    foundDate = False

    fout = open(outfile,'w')

    for filename in fileList:

        foundDate = False

        with open(filename) as f:                  
            header = [next(f) for x in xrange(10)]           
            f.close()

            for line in header:            
                if sent in line:
                    for searchDate in searchDates:                                                    
                        if searchDate in line:
                            foundDate = True
                            break

                if foundDate == True:                                                    
                    fout.write(filename + '\n')
                    break

    fout.close()

问题是,代码处理前10000封电子邮件的速度相当快,但随后开始明显减慢,并且需要很长时间才能覆盖其余的电子邮件。我已经调查了一些可能的原因,但没有找到一个。我不知道我是否在做一些效率低下的事情

你的代码中有错误。它们与减速的关系尚不清楚。无论如何,您不应该调用
f.close()
,因为您已经有了
with
,对于
fout
也应该有
with
,如果foundDate==True不应该在
for line in header
循环中。顺便说一句,读前10行是错误的。标题可以更长,以空行结尾,可以换行(多行中有一个标题),
foundDate=False
在文件列表中文件名的
之外
没有任何意义。最后,要查看什么是慢的,请使用“运行脚本时是否检查了内存问题?”?这对我来说似乎相当有效。也许,在脚本完成后,尝试将结果保存在内存中并写入所有内容。在它尝试将其写入光盘之前,缓冲了多少数据?根本不确定这是否是代码中的错误。如果你在任何地方都有一个写头缓存——甚至可能在你的RAID控制器中,特别是在备有电池的情况下更为常见——那么写入缓存的速度将比满时快得多,需要等待缓冲区刷新。因此,无论应用程序的行为如何,磁盘I/O通常都是突发性的。请分析您的代码,看看它在哪里花费了大部分时间,这样您和其他人就可以停止猜测了。这很容易做到,明白吗