Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.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读取大文件_Python - Fatal编程技术网

用Python读取大文件

用Python读取大文件,python,Python,我试图读取目录中的一些文件,其中有10个文本文件。随着时间的推移,文件的数量会增加,到目前为止,总大小约为400MB 文件内容的格式为: student_name:student_ID:date_of_join:anotherfield1:anotherfield2 如果有匹配,我必须把整行打印出来。这是我试过的 findvalue = "student_id" #this is users input alphanumeric directory = "./RecordFolder" for

我试图读取目录中的一些文件,其中有10个文本文件。随着时间的推移,文件的数量会增加,到目前为止,总大小约为400MB

文件内容的格式为:

student_name:student_ID:date_of_join:anotherfield1:anotherfield2
如果有匹配,我必须把整行打印出来。这是我试过的

findvalue = "student_id" #this is users input alphanumeric
directory = "./RecordFolder"
for filename in os.listdir(directory):
    with open(os.path.join(directory, filename)) as f:
        for line in f:
            if findvalue in line:
                print line

这是可行的,但需要很多时间。如何减少运行时间?

与计算相比,IO是出了名的慢,而且考虑到您处理的是大文件,最好是逐行处理文件。在Python中,我看不到一个明显的简单方法来加速这个过程

根据您的点击频率(即第行中的findvalue),您可能会决定写入文件,以避免控制台输出减慢速度,但如果找到的项目相对较少,则不会有太大区别

我认为对于Python来说,没有什么明显的和主要的事情可以做。您可以随时探索其他工具,如grep或数据库。。。作为替代办法


附言:不需要其他:通过

与计算相比,IO是出了名的慢,而且考虑到您处理的是大文件,最好是逐行处理文件。在Python中,我看不到一个明显的简单方法来加速这个过程

根据您的点击频率(即第行中的findvalue),您可能会决定写入文件,以避免控制台输出减慢速度,但如果找到的项目相对较少,则不会有太大区别

我认为对于Python来说,没有什么明显的和主要的事情可以做。您可以随时探索其他工具,如grep或数据库。。。作为替代办法


附言:不需要其他:通过

当文本文件变得太慢时,您需要开始查看数据库。数据库的主要用途之一是智能地处理来自持久数据存储的IO

根据应用程序的需要,可能是一个很好的选择。我怀疑这就是你想要的,因为你似乎没有一个庞大的数据集。从这里开始,只需进行数据库API调用并允许SQLite处理查找—它比您做得好得多


如果有一些奇怪的原因,你真的不想使用一个数据库,那么如果可能的话,考虑进一步把你的数据分解成一棵树。例如,可以为字母表中的每个字母创建一个文件,在其中放置学生数据。这将减少循环时间,因为您正在减少每个文件的学生数量。这是一个快速的破解,但我认为如果你使用数据库,你会少掉头发。

当文本文件变得太慢时,你需要开始查看数据库。数据库的主要用途之一是智能地处理来自持久数据存储的IO

根据应用程序的需要,可能是一个很好的选择。我怀疑这就是你想要的,因为你似乎没有一个庞大的数据集。从这里开始,只需进行数据库API调用并允许SQLite处理查找—它比您做得好得多


如果有一些奇怪的原因,你真的不想使用一个数据库,那么如果可能的话,考虑进一步把你的数据分解成一棵树。例如,可以为字母表中的每个字母创建一个文件,在其中放置学生数据。这将减少循环时间,因为您正在减少每个文件的学生数量。这是一个快速的破解,但我认为如果你使用数据库,你会少掉头发。

定义很多时间:在我的例子中,类似的例子在一个120M的文件上使用0.392s。因此,在一个400米的文件上大约需要1.2秒。您的代码和我的代码唯一的区别是,我以“只读”模式显式打开文件。有一点提示,与您的问题完全无关:否则:pass完全没有必要,请丢失它。如果语句不需要有else,那么操作系统可能会有所不同,但差别不大。然而,硬盘上的I/O负载将起到不同的作用:很难说是什么导致了延迟。基本上,你的文件读取速度和硬盘允许你读取的速度一样快。@whisky这是我最安全的赌注,没有更多信息。正如您在我的粘贴示例中看到的,类似的代码在SSD驱动的机器上以不到4秒的时间遍历900M二进制文件。在执行过程中,我确实看到了240MB/秒的读取峰值。如果这里的stdout是tty,则输出到文件而不是屏幕也可能会显著加快速度。相对而言,终端打印东西的速度非常慢。定义大量的时间:在我的例子中,类似的例子在120M文件上大约需要0.392秒。因此,在一个400米的文件上大约需要1.2秒。您的代码和我的代码唯一的区别是,我以“只读”模式显式打开文件。有一点提示,与您的问题完全无关:否则:pass完全没有必要,请丢失它。如果语句不需要有else,那么操作系统可能会有所不同
,但差别不大。然而,硬盘上的I/O负载将起到不同的作用:很难说是什么导致了延迟。基本上,你的文件读取速度和硬盘允许你读取的速度一样快。@whisky这是我最安全的赌注,没有更多信息。正如您在我的粘贴示例中看到的,类似的代码在SSD驱动的机器上以不到4秒的时间遍历900M二进制文件。在执行过程中,我确实看到了240MB/秒的读取峰值。如果这里的stdout是tty,则输出到文件而不是屏幕也可能会显著加快速度。终端打印东西的速度非常慢,相比之下,没有解释的下一票对任何人、任何人或我都没有帮助。。我总是很乐意纠正错误或改进答案,但这需要建设性的反馈,也就是说,不仅仅是匿名点击。你还没有真正回答OP的任何问题。你刚才重申了这个问题。不过,您的编辑肯定会使答案更有成效,因此我将删除我的否决票。@否决票没有解释的否决票对任何人、任何人或我都没有帮助。。我总是很乐意纠正错误或改进答案,但这需要建设性的反馈,也就是说,不仅仅是匿名点击。你还没有真正回答OP的任何问题。你刚才重申了这个问题。不过,你的编辑肯定会让答案更有成效,所以我取消了我的反对票。