首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OSError:[Errno 24]使用Nibabel打开的文件太多

OSError:[Errno 24]使用Nibabel打开的文件太多
EN

Stack Overflow用户
提问于 2018-03-04 18:46:19
回答 3查看 398关注 0票数 0

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

代码语言:javascript
复制
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。我使用了下面的代码,发现它在最后一个元素中出现了错误。

代码语言:javascript
复制
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。谢谢!

EN

回答 3

Stack Overflow用户

发布于 2018-03-04 18:56:12

不熟悉尼巴贝尔,但可以试试with

代码语言:javascript
复制
    health_data = []
    for filepath in glob.glob(healthdir+'*.nii'):
       with nib.load(filepath) as health:
           health_data.append(health.get_data())

**未测试

票数 0
EN

Stack Overflow用户

发布于 2019-07-13 01:34:59

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

代码语言:javascript
复制
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
票数 0
EN

Stack Overflow用户

发布于 2021-09-07 08:52:56

我在导入一些自生成的NIfTI图像时也遇到了同样的问题。

我用nilearn而不是nibabel解决了这个问题。

代码语言:javascript
复制
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

为我处理了10000张图片,花了大约12分钟。

smooth_img读取nifti并应用大小为fwhm的平滑内核(全宽半最大...我想)。我这样做是因为它可以工作,我需要在脚本中的不同情况下进行这种平滑。你可以查看nilear.image.load_img。它也应该做同样的事情。

最好的

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49094535

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档