2015-10-05 52 views
3

我試圖加載到內存中的幾個2 000 FITS利用astropy.io.fitsOSERROR 24(打開的文件太多)閱讀一堆FITS當與astropy.io

def readfits(filename): 
    with fits.open(filename) as ft: 
     # the fits contain a single HDU 
     data = ft[0].data 
    return data 

data_sci = [] 
for i in range(2000): 
    data_sci.append(readfits("filename_{}.fits".format(i))) 

然而,在到達1015次文件時,OSError: [Errno 24] Too many open files被引發。

我有同樣的問題:

def readfits(filename): 
    ft = fits.open(filename) as ft: 
    data = ft[0].data 
    ft.close() 
    return data 

我懷疑astropy.io.fits不能正常關閉文件。有沒有 我可以強制文件被關閉的方式?

回答

1

readfits函數實際上離開的文件句柄,以保持對數據的訪問開放的,因爲默認情況下它會創建一個mmap的數據和不讀它完全在物理內存中,爲解釋:http://astropy.readthedocs.org/en/latest/io/fits/appendix/faq.html#i-m-opening-many-fits-files-in-a-loop-and-getting-oserror-too-many-open-files

順便說一句,如果你只是想一個函數讀取數據出第一HDU這已經內置:http://docs.astropy.org/en/v1.0.5/io/fits/api/files.html#astropy.io.fits.getdata

沒有必要重新發明輪子。

3
+0

謝謝,這是我正在尋找的信息!我使用的解決方案有點不同,因爲我需要將數據保存在內存中,所以我不能盲目使用'del'。我簡單地用'data = ft [0] .data.copy()'替換了'data = ft [0] .data'行。 –

+1

如果你使用'data.copy()',那麼你將整個數據加載到內存中,所以你可以用'memmap = False'打開文件,然後就沒有問題了。 此外,如果數據由表格組成,則存在一個問題,現在已修復,導致資源泄漏。 – Iguananaut

+0

@Iguananaut,絕對購買'memmap = False'。我應該仔細閱讀「open」文檔...... –

0

只要有內存,就可以調用該函數並存儲其輸出。我認爲它值得提及明確的答案,但功勞歸功於Iguananaut,bkafthis page

def get_single_fits_data(fits_dir): 

    hdul = fits.open(fits_dir) 
    for hdu in hdul: 
     image_data = hdu.data.copy() 
    hdul.close() 
    gc.collect() 

    return image_data 
相關問題