2012-08-04 134 views
1

我正在尝试读取某个目录中的一些文件,该目录中有10个文本文件。随着时间的推移,文件数量增加,现在总大小约为400MB。用Python读取大文件

文件内容的格式为:

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 

这是有效的,但它需要很长时间。我怎样才能缩短运行时间?

+0

如果您只读取顺序,您可以使用[内存映射文件](http://en.wikipedia.org/wiki/Memory-mapped_file)。 – 2012-08-04 15:50:57

+2

定义很多时间:)在我的情况下,类似的例子在一个120M文件上需要大约0.392s。所以应该在400M文件上花费大约1.2秒。你的代码和我的唯一区别是,我明确地打开''r'ead-only'模式的文件。 – favoretti 2012-08-04 15:51:59

+0

不需要5分钟左右:/对我来说 – Whiskey 2012-08-04 15:56:10

回答

1

与计算相比,IO的速度非常慢,并且考虑到您处理的是大文件,它可能最好是逐行处理文件。我没有看到一个明显简单的方法来加速Python。

根据您的“点击次数”(即findvalue in line)的频率,您可能会决定写入文件,以免被控制台输出速度放慢,但如果找到的项目相对较少,没有太大区别。

我认为Python没有什么明显的,你可以做的主要。您可以随时探索其他工具(如grep或数据库...)作为替代方法。

PS:不用了,else:pass ..

+0

@ downvoter A downvote ***没有***解释不会帮助*任何人*(OP,SO或我)..我总是乐于纠正错误或改进答案,但这需要*建设性的反馈*,即,不只是一个匿名点击。 – Levon 2012-08-05 16:48:43

+0

你还没有真正回答OP的问题。你刚才重申了这个问题。你的编辑当然会让答案更有成效,所以我正在消除我的失望。 – blz 2012-08-07 07:07:47

4

当TEXTFILES变得太慢,你需要开始寻找数据库。数据库的主要目的之一是智能地处理来自持久数据存储的IO。

根据您的应用需求,SQLite可能是一个很好的选择。我怀疑这是你想要的,因为你似乎没有庞大的数据集。从那里开始,这只是一个制作数据库API调用并允许SQLite处理查询的问题 - 它比你做得更好!

如果(出于某种奇怪的原因)你确实不想使用数据库,那么考虑进一步将数据拆分为树,如果可能的话。例如,您可以为放置学生数据的字母表中的每个字母设置一个文件。这可以减少循环时间,因为你减少了每个文件的学生数量。这是一个快速入侵,但我认为如果你使用数据库,你会失去更少的头发。