【问题标题】:OSError: [Errno 24] Too many open files using NibabelOSError: [Errno 24] 使用 Nibabel 打开的文件过多
【发布时间】:2018-08-12 04:02:16
【问题描述】:

我有一个python3.6的程序,使用nibabel包分析NIFTI格式的医学图像。

import glob
import nibabel as nib
health = [nib.load(pt) for pt in glob.glob(healthdir+'*.nii')] # len = 200
health_data = [h.get_data() for h in health]

最后一行出现OSError: [Errno 24] Too many open files。我使用了以下代码,发现它在最后一个元素中发生了错误。

health_data = []
for i in range(len(health)):
    try:
        health_data.append(health[i].get_data())
    except:
        print(i) # 199

我曾尝试搜索相关主题,例如 Nibabel: IOError: [Errno 24] Too many open files:。但是,它并不能解决问题。另外,我不喜欢使用ulimit。谢谢!

【问题讨论】:

  • 嗨@djfire,你有没有设法解决这个问题?

标签: python image macos operating-system medical


【解决方案1】:

不熟悉 Nibabel,但尝试with

    health_data = []
    for filepath in glob.glob(healthdir+'*.nii'):
       with nib.load(filepath) as health:
           health_data.append(health.get_data())

**未测试

【讨论】:

  • AttributeError: __enter__
【解决方案2】:

您可能需要在使用后删除该对象。

def show_origin_image(name,s=100,max_limit=None, min_limit=None):
    origin = name
    file_name_list = [each for each in os.listdir(origin) if not each.startswith('.')]
    file_name_list = file_name_list[min_limit:max_limit]
    dimension = 2
    width_num = 6
    height_num = math.ceil(len(file_name_list) / width_num)
    plt.figure(figsize=(15, height_num * 2.8))
    data_list = []
    for n,each in enumerate(file_name_list, 1):
        agent = nib.load(os.path.join(origin, each), keep_file_open=False)
        three_d_data = np.asarray(agent.dataobj)
        size = three_d_data.shape
        image = np.take(three_d_data, s, dimension)
        plt.subplot(height_num, width_num, n)
        plt.imshow(image, 'gray')
        plt.axis('off')
        data_list.append(three_d_data)
        # add delete operation!
        del agent
    return data_list

【讨论】:

  • 遇到了同样的问题,删除对象没有帮助。然而,我的循环在图像 4005 处停止(从 10 000 开始)。所以既不是最后一个元素,也不是第 200 个元素。但这可能来自我正在开发的强大服务器
【解决方案3】:

我在导入大量自行生成的 NIfTI 图像时遇到了同样的问题。
使用nilearn 而不是nibabel 为我解决了这个问题。

from nilearn.image import smooth_img
import glob
image_dir = glob.glob(some_path + '*.nii')
images = smooth_img(image_dir, fwhm=None)
image_maps = []
for img in images:
    img_data = img.get_fdata()
    image_maps.append(img_data)
    del img_data

为我处理了 10 000 张图像,花了大约 12 分钟。
smooth_img 读取 nifti 并应用大小为 fwhm 的平滑内核(最大全宽……我认为)。我这样做是因为它有效,并且我需要在脚本中的不同情况下进行这种平滑处理。您可以查看nilear.image.load_img。它也应该这样做。

最好的

【讨论】:

    猜你喜欢
    • 2020-03-07
    • 1970-01-01
    • 2016-04-21
    • 2019-04-11
    • 1970-01-01
    • 2022-07-21
    • 2021-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多