哪种方式更好地从/向大文件读/写数据?

时间:2016-07-21 00:30:08

标签: python matlab file io hdf5

如果我们需要在处理之前/之后每次从/向大文件读取/写入一些数据,以下哪种方式(使用一些演示Python代码)更好?

  1. 每次需要读/写时打开文件,并在读/写后立即关闭。这种方式似乎更安全?但因为我们需要打开和关闭很多次,所以速度较慢? for i in processing_loop: with open(datafile) as f: read_data(...) process_data(...) with open(resultfile,'a') as f: save_data(...) 这看起来很尴尬,但似乎matlab在其.mat文件IO函数loadsave中采用了这种方式。我们直接致电loadsave,无需明确openclose

  2. 打开文件并关闭,直到我们完成所有工作,速度更快但如果程序引发错误则文件保持打开的风险,或文件已损坏如果程序终止不料。 fr = open(datafile) fw = open(resultfile,'a') for i in processing_loop: read_data(...) process_data(...) save_data(...) fr.close() fw.close() 事实上,当程序被杀时,我有几个hdf5文件以这种方式被破坏。

  3. 似乎人们更喜欢第二个用with包裹循环。

     with open(...) as f:
         ...
    

    或异常捕获块。

    我知道这两件事,我确实使用过它们。但是当程序被杀时,我的hdf5文件仍然被破坏了。

    • 一旦我试图将一个巨大的数组写入hdf5文件并且该程序被卡住了很长时间,所以我杀了它,然后文件被破坏了。

    • 很多时候,程序会被终止,因为服务器突然停机或运行时间超过了停机时间。

    我没注意,只有在将数据写入文件时终止程序时才会发生损坏。如果是这样,则表示文件结构已损坏,因为它不完整。因此,如果每次刷新数据都会有所帮助,这会增加IO负载,但可能会降低终止时将数据写入文件的可能性。[/ p>

    我尝试了第一种方法,只有在需要读/写数据时访问文件。但显然速度很慢。打开/关闭文件句柄时后台会发生什么?不只是制作/销毁指针?为什么open/close操作费用如此之高?

2 个答案:

答案 0 :(得分:0)

您应该将代码包装在try except finally的解决方案2中,并始终最终关闭该文件。这样即使出现错误,您的文件也会自行关闭。

编辑:正如其他人指出的那样,您可以使用with为您处理。

答案 1 :(得分:0)

如果您担心在“with”语句中使用多个文件,则可以使用复合语句打开多个文件,或嵌套“with”块。这在答案中有详细说明:

How to open a file using the open with statement

至于程序引发错误时会发生什么,这就是try / except块的用途。如果您知道预期的错误,您可以轻松地围绕您的process_data()调用。同样,除了块之外的一个可以捕获多个异常。

https://docs.python.org/3/tutorial/errors.html#handling-exceptions