使用astropy.io读取大量FITS文件时出现OSError 24(打开文件太多)。

6

我正在尝试使用 astropy.io.fits 加载几个 2 000 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 没有正确关闭文件。是否有办法强制关闭文件?
3个回答

3

1
谢谢,这正是我在寻找的信息!不过我使用的解决方案有点不同:由于我需要将数据保存在内存中,所以不能盲目使用 del。我只是用 data = ft[0].data.copy() 替换了 data = ft[0].data 这一行。 - Arcturus B
1
如果你使用 data.copy(),那么整个数据都会被加载到内存中,因此最好使用 memmap=False 直接打开文件,这样就不会有问题了。另外,如果数据包含表格,则曾经存在一个问题,现在已经修复,该问题导致资源泄漏。 - Iguananaut
@Iguananaut,一定要加上memmap=False。我应该更仔细地阅读open的文档... - Arcturus B
这是一个棘手的问题,很容易被忽视。同时打开许多文件并不是最常见的情况,但它足够常见,应该有更好的界面来处理。 - Iguananaut

3

你的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

没必要重复造轮子。


0

只要您有足够的内存,就可以调用此函数并存储其输出。我认为值得明确提及答案,但功劳归于 Iguananaut, bkaf, 和 this 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接