代碼爲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)
我對mmap
沒有多少經驗。它看起來像基於文件中的一個字節塊設置一個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文件獲取的數據數組,請參閱下面的示例。