2012-07-05 50 views
15

我有大约50 GB的文本文件,我正在检查每行的前几个字符,并将这些字符写入指定用于该起始文本的其他文件。Python文件每次打开/关闭与保持打开状态直到完成过程

例如。 我输入包含:

cow_ilovecow 
dog_whreismydog 
cat_thatcatshouldgotoreddit 
dog_gotitfromshelter 
............... 

所以,我要处理他们在牛,狗和猫(约200)类别 所以,

if writeflag==1: 
    writefile1=open(writefile,"a") #writefile is somedir/dog.txt.... 
    writefile1.write(remline+"\n") 
    #writefile1.close() 

那么,什么是最好的方式,我应该关?否则,如果我保持开放,是writefile1=open(writefile,"a")做正确的事情?

回答

28

你一定要尝试打开/关闭文件尽可能少

因为即使文件读/写的比较,文件打开/关闭是昂贵得多

考虑两个代码块:

f=open('test1.txt', 'w') 
for i in range(1000): 
    f.write('\n') 
f.close() 

for i in range(1000): 
    f=open('test2.txt', 'a') 
    f.write('\n') 
    f.close() 

第一个就是0.025s而第二个需要0.309s

+0

太好了,应该已经测试过了,现在这样可以使很少的开/关语句更有意义 – Ananta 2012-07-05 17:58:22

1

让它一直开着!否则,你告诉系统你已经完成了写操作,它可能决定将其刷新到磁盘上而不是缓冲它。并且由于显而易见的原因n磁盘写入比磁盘写入贵得多。

如果你想附加到文件,而不覆盖它然后是的,a是正确的模式。

+0

谢谢,我总是打开但文件加载到内存中的整个文件。 – Ananta 2012-07-05 18:06:00

4

使用with语句时,它会自动关闭该文件为你做的所有操作with块内,所以它会继续为你打开文件,一旦你走出with块将关闭文件。

with open(inputfile)as f1, open('dog.txt','a') as f2,open('cat.txt') as f3: 
    #do something here 

编辑: 如果你知道要使用所有可能的文件名代码的编译,然后使用with之前是一个更好的选择,如果你不这样做,那么你应该用你的方法,但不是关闭文件即可flush将数据写入文件使用writefile1.flush()

+0

如果他为输入中的每个前缀打开一个新文件,'with'语句可能会有点笨拙,并且在编译时是否知道所有可能的前缀都不清楚。 – geoffspear 2012-07-05 17:07:31

+0

@Wooble好点!使用'with'意味着他需要在运行前知道所有的文件名,但是如果他知道所有的文件名,那么在这种情况下'with'是更好的选择。 – 2012-07-05 17:13:45

+1

另外,对于200个类别,文件的字典而不是200个变量可能是最好的解决方案。 – geoffspear 2012-07-05 17:15:11

-1

IO操作消耗的时间太多。也打开并关闭文件。

如果您打开两个文件(输入和输出),使用内存缓冲区(例如10MB大小)进行文本处理,然后将其写入输出文件,速度会更快。例如:

file = {} # just initializing dicts 
filename = {} 
with open(file) as f: 
    file['dog'] = None 
    buffer = '' 
    ... 
    #maybe there is a loop here 
    if writeflag: 
     if file['dog'] == None: 
      file['dog'] = open(filename['dog'], 'a') 
     buffer += remline + '\n' 
    if len(buffer) > 1024*1000*10: # 10MB of text 
     files['dog'].write(buffer) 
     buffer = '' 

for v in files.values(): 
    v.close() 
+0

我可能会这样做,但我想它应该是不同的缓冲区为每个前缀,所以,在处理原始文件中的某些行后写入所有文件可能会更好的选项权利? – Ananta 2012-07-05 18:04:36

+0

-1,这是你应该在你的应用程序代码中做的事。操作系统足够聪明,如果你允许它们自己缓冲读/写操作(即在每次操作后不要关闭/重新打开文件)。更不用说为缓冲区使用字符串与列表相比相当昂贵。 – ThiefMaster 2012-07-05 18:26:55

+0

@ThiefMaster我刚做了一个简单的基准测试,结果发现使用字符串缓冲区的速度比直接使用io的速度快13%,比使用列表缓冲区的速度快5%。实际上,Python中的字符串操作是真正优化的。你可以在这里查看代码:http://paste.kde.org/513206/ – 2012-07-05 20:56:09

相关问题