2015-10-05 53 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 
相关问题