6

我正在尝试使用以下方法将一些 2 000 FITS 加载到内存中astropy.io.fits

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没有正确关闭文件。有没有办法强制关闭文件?

4

3 回答 3

3

在查看了 astropy 文档后,我发现了这个:http ://astropy.readthedocs.org/en/latest/io/fits/appendix/faq.html#im-opening-many-fits-files-in-a-循环和获取 oserror-打开文件太多

于 2015-10-05T15:44:50.797 回答
3

您的readfits函数实际上使文件句柄保持打开状态以保持对数据的访问,因为默认情况下它会为数据创建一个mmap并且不会将其完全读入物理内存,如下所述:http ://astropy.readthedocs.org/ en/latest/io/fits/appendix/faq.html#im-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

没有必要重新发明轮子。

于 2015-10-06T15:10:38.267 回答
0

只要你有记忆,你就可以调用这个函数并存储它的输出。我认为值得明确提及答案,但功劳归于 Iguananautbkaf此页面

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
于 2017-03-23T03:57:15.337 回答