我正在尝试读取目录中的一些文件,该目录有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
这样可行,但需要花费很多时间。如何减少运行时间?
答案 0 :(得分:4)
当文本文件变得太慢时,您需要开始查看数据库。数据库的主要目的之一是从持久数据存储中智能地处理IO。
根据您的应用需求,SQLite可能非常合适。我怀疑这是你想要的,因为你似乎没有庞大的数据集。从那里开始,只需要进行数据库API调用并允许SQLite处理查找 - 它比你做得好得多!
如果(由于某些奇怪的原因)您确实不想使用数据库,那么考虑进一步将数据分解为树,如果可能的话。例如,您可以为放置学生数据的字母表中的每个字母创建一个文件。这样可以减少循环时间,因为您减少了每个文件的学生数量。这是一个快速的黑客攻击,但我认为如果你使用数据库,你将失去更少的头发。
答案 1 :(得分:1)
与计算相比,IO的速度非常慢,并且鉴于您正在处理大型文件,因此最好逐行处理文件。我没有看到一种明显的简单方法来加速Python。
根据您的“命中”(即findvalue in line
)的频率,您可能决定写入文件,以免被控制台输出放慢速度,但是如果找到相对较少的项目,它不会产生太大的影响。
我认为对于Python来说,没有什么是显而易见的,你可以做的很重要。您可以随时探索其他工具(例如grep或数据库......)作为替代方法。
PS:不需要else:pass
..