【发布时间】:2016-11-24 09:06:52
【问题描述】:
如果我们需要在处理之前/之后每次从大文件中读取/写入一些数据,那么以下哪种方式(带有一些演示 Python 代码)更好?
每次需要读/写时打开文件,读/写后立即关闭。这种方式似乎更安全?但是因为我们需要打开和关闭很多次,所以速度较慢?
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 函数load和save中采用了这种方式。我们直接调用load和save,没有明确的open或close。打开并关闭文件,直到我们完成所有工作,速度更快,但如果程序出错,文件可能会保持打开状态,或者如果程序终止,文件会损坏不料。
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 运营成本如此之高?
【问题讨论】:
-
加载和保存 .mat 文件是完全不同的野兽。它只是从工作区保存变量。 python中的等价物类似于“搁置”。 (事实上,scipy 也有 loadmat / savemat 功能)。我会理解这里讨论的读取和写入文件比这更笼统。
-
我不清楚为什么这些是互斥的?为什么不能将
for循环放在with块内?您可以使用单个with语句打开多个文件。 -
@TasosPapastylianou 是的,我们谈论的是更一般的情况。我只是提到了 mat 文件作为第一种情况的实际示例。 @TheBlackCat 真正的代码可能相当长,并且包含很多嵌套事件,我想很多人无法忍受像我这样丑陋的风格。而
with在意外终止的情况下也无济于事。正如我所提到的,当服务器关闭并且我的程序被杀死时,我的 hdf5 文件以这种方式损坏。
标签: python matlab file io hdf5