Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python OSError 24(打开的文件太多)在使用astropy.io读取一堆文件时_Python_Fits_Astropy - Fatal编程技术网

Python OSError 24(打开的文件太多)在使用astropy.io读取一堆文件时

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

我试图使用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("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