2015-06-08 38 views
3

這可能很簡單,但我一直無法在網上找到解決方案... 我試圖與一系列存儲爲netcdf文件的數據集一起工作。我打開每一個,閱讀一些關鍵點,然後轉到下一個文件。我發現我經常打mmap錯誤/腳本越來越慢,隨着更多的文件被讀入。我相信這可能是因爲netcdf文件沒有被.close()命令正確關閉。如何確保在python中關閉netcdf文件?

我一直在測試這個:

from scipy.io.netcdf import netcdf_file as ncfile 
f=ncfile(netcdf_file,mode='r') 
f.close() 

然後,如果我嘗試

>>>f 
<scipy.io.netcdf.netcdf_file object at 0x24d29e10> 

>>>f.variables['temperature'][:] 
array([ 1234.68034431, 1387.43136567, 1528.35794546, ..., 3393.91061952, 
    3378.2844357 , 3433.06715226]) 

所以它出現在文件仍處於打開狀態? close()實際上做了什麼?我怎麼知道它已經工作? 有沒有辦法關閉/清除所有打開的文件從Python?

軟件: 的Python 2.7.6,SciPy的0.13.2,創建NetCDF 4.0.1

回答

1

代碼爲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文件獲取的數據數組,請參閱下面的示例。

相關問題