Python OSError 24(打开的文件太多)在使用astropy.io读取一堆文件时
我试图使用astropy.io.FITS将2000个FITS加载到内存中:Python OSError 24(打开的文件太多)在使用astropy.io读取一堆文件时,python,fits,astropy,Python,Fits,Astropy,我试图使用astropy.io.FITS将2000个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("fil
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]打开的文件太多
将引发文件
我也有同样的问题:
def readfits(filename):
ft = fits.open(filename) as ft:
data = ft[0].data
ft.close()
return data
我怀疑astropy.io.fits
没有正确关闭该文件。有没有
强制关闭文件的方法?查看astropy文档后,我发现:您的
readfits
函数实际上会打开文件句柄以保持对数据的访问,因为默认情况下,它会创建对数据的访问,而不会将数据完全读取到物理内存中,如下所述:
顺便说一句,如果您只是想要一个从第一个HDU读取数据的函数,那么它已经内置了:
无需重新发明控制盘。只要有内存,就可以调用此函数并存储其输出。我认为有必要明确地提及答案,但这要归功于,以及
谢谢,这是我正在搜索的信息!不过,我使用的解决方案有点不同:因为我需要将数据保存在内存中,所以我不能盲目地使用
del
。我只是用data=ft[0].data
替换了data=ft[0].data.copy()
行。如果执行data.copy()
操作,则无论如何都会将整个数据加载到内存中,因此您可以使用memmap=False
打开文件,这样就没有问题了。另外,如果数据由表组成,则存在导致资源泄漏的问题(现已修复)。@iGuanaaut,绝对相信memmap=False
。我应该更仔细地阅读open
的文档……这是一件棘手的事情;容易错过。同时打开大量文件并不是最常见的情况,但这种情况已经足够普遍,因此应该有一个更好的界面。
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