哪种方式从大文件读取/写入数据更好



如果我们每次处理前后都需要从大文件中读取/写入一些数据,以下哪种方式(带有一些演示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,没有明确的open也没有close

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

似乎伙计们更喜欢第二个将循环包裹在with.

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

或在异常捕获块中。

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

  • 有一次我试图将一个巨大的数组写入 hdf5 文件,程序卡住了很长时间,所以我杀死了它,然后文件就损坏了。

  • 很多时候,程序会因为服务器突然关闭或运行时间超过挂机时间而终止。

我没有注意是否仅在将数据写入文件时程序终止时才发生损坏。如果是这样,则表示文件结构已损坏,因为它不完整。因此,我徘徊是否每次刷新数据会有所帮助,这会增加 IO 负载,但可能会减少终止时将数据写入文件的机会。

我尝试了第一种方法,仅在需要读取/写入数据时才访问文件。但显然速度变慢了。当我们打开/关闭文件句柄时,后台会发生什么?不仅仅是制作/销毁指针?为什么open/close运营成本如此之高?

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

如何使用 open with 语句打开文件

至于当程序引发错误时会发生什么,这就是try/except 块的用途。如果您知道预期会出现哪些错误,则可以轻松地将 process_data(( 调用包围起来。同样,一个 except 块可以捕获多个异常。

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

您应该将

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

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

相关内容

  • 没有找到相关文章

最新更新