f.close 的代码是:
Definition: f.close(self)
Source:
def close(self):
"""Closes the NetCDF file."""
if not self.fp.closed:
try:
self.flush()
finally:
self.fp.close()
f.fp 是文件对象。所以
In [451]: f.fp
Out[451]: <open file 'test.cdf', mode 'wb' at 0x939df40>
In [452]: f.close()
In [453]: f.fp
Out[453]: <closed file 'test.cdf', mode 'wb' at 0x939df40>
但我从玩f 中看到,我仍然可以创建维度和变量。但是f.flush() 返回错误。
它看起来不像在数据写入期间使用mmap,只是在读取期间使用。
def _read_var_array(self):
....
if self.use_mmap:
mm = mmap(self.fp.fileno(), begin_+a_size, access=ACCESS_READ)
data = ndarray.__new__(ndarray, shape, dtype=dtype_,
buffer=mm, offset=begin_, order=0)
else:
pos = self.fp.tell()
self.fp.seek(begin_)
data = fromstring(self.fp.read(a_size), dtype=dtype_)
data.shape = shape
self.fp.seek(pos)
我对@987654329@ 没有太多经验。看起来它基于文件中的一个字节块设置了一个mmap 对象,并将其用作变量的数据缓冲区。如果基础文件关闭,我不知道该访问会发生什么。如果出现某种mmap 错误,我不会感到惊讶。
如果使用mmap=False 打开文件,则将整个变量读入内存,并像常规的numpy 数组一样访问。
mmap : None or bool, optional
Whether to mmap `filename` when reading. Default is True
when `filename` is a file name, False when `filename` is a
file-like object
我的猜测是,如果您在未指定 mmap 模式的情况下打开文件,从中读取一个变量,然后关闭该文件,那么以后引用该变量及其数据是不安全的。任何需要加载更多数据的引用都可能导致mmap 错误。
但是如果你用mmap=False打开文件,你应该可以在关闭文件后切片变量。
我看不出一个文件或变量的mmap 会如何干扰对其他文件和变量的访问。但我必须在mmap 上阅读更多内容才能确定这一点。
来自netcdf 文档:
请注意,当 netcdf_file 用于打开 mmap=True 的文件(默认为只读)时,它返回的数组直接引用磁盘上的数据。该文件不应关闭,并且在询问此类数组是否存在时不能干净地关闭。如果要在关闭文件后处理从 mmapped Netcdf 文件中获取的数据数组,您可能需要复制它们,请参见下面的示例。