Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在dask.Array任务图中嵌入前/后计算操作

在dask.Array任务图中嵌入前/后计算操作
EN

Stack Overflow用户
提问于 2021-11-14 14:20:00
回答 1查看 135关注 0票数 1

我感兴趣的是创建一个dask.array.Array,它在compute()之前/之后打开和关闭资源。但是,我不想假设最终用户将如何调用compute,我希望避免创建自定义的dask Array子类或代理对象,因此我试图将操作嵌入到数组的底层__dask_graph__中。

(旁白:请暂时忽略关于在dask中使用有状态对象的警告,我知道其中的风险,这个问题只是关于任务图的操作)。

请考虑下面的类,该类模拟必须处于打开状态的文件读取器才能读取块,否则就会出现分段错误。

代码语言:javascript
运行
AI代码解释
复制
import dask.array as da
import numpy as np

class FileReader:
    _open = True

    def open(self):
        self._open = True

    def close(self):
        self._open = False

    def to_dask(self) -> da.Array:
        return da.map_blocks(
            self._dask_block,
            chunks=((1,) * 4, 4, 4),
            dtype=float,
        )

    def _dask_block(self):
        if not self._open:
            raise RuntimeError("Segfault!")
        return np.random.rand(1, 4, 4)

如果文件保持打开状态,则一切正常,但如果关闭该文件,则从to_dask返回的dask数组将失败:

代码语言:javascript
运行
AI代码解释
复制
>>> t = FileReader()
>>> darr = t.to_dask()
>>> t.close()
>>> darr.compute()  # RuntimeError: Segfault!

当前任务图如下所示:

代码语言:javascript
运行
AI代码解释
复制
>>> list(darr.dask)
[
    ('_dask_block-aa4daac0835bafe001693f9ac085683a', 0, 0, 0),
    ('_dask_block-aa4daac0835bafe001693f9ac085683a', 1, 0, 0),
    ('_dask_block-aa4daac0835bafe001693f9ac085683a', 2, 0, 0),
    ('_dask_block-aa4daac0835bafe001693f9ac085683a', 3, 0, 0)
]

本质上,我想在开始时添加新任务,这是_dask_block层所依赖的,而任务则是依赖于_dask_block的。

我尝试直接操作HighLevelGraph输出的da.map_blocks来手动添加这些任务,但是发现它们在计算优化过程中被修剪了,因为darr.__dask_keys__()不包含我的键(而且,我也希望避免子类化或要求最终用户使用特殊的优化标志调用compute )。

一个解决方案是确保传递给map_blocks的map_blocks函数总是打开并关闭底层资源.但让我们假设开放/关闭过程相对缓慢,有效地破坏了单机并行性的性能。所以我们只想在开始的时候打开,在结尾的时候关闭。

我可以“欺骗”一些以包含打开文件的任务,方法是在对map_blocks的调用中包含一个新密钥,如下所示:

代码语言:javascript
运行
AI代码解释
复制
    ...
    
    # new method that will run at beginning of compute()
    def _pre_compute(self):
        was_open = self._open
        if not was_open:
            self.open()
        return was_open

    def to_dask(self) -> da.Array:
        # new task key
        pre_task = 'pre_compute-' + tokenize(self._pre_compute)
        arr = da.map_blocks(
            self._dask_block,
            pre_task,  # add key here so all chunks depend on it
            chunks=((1,) * 4, 4, 4),
            dtype=float,
        )
        # add key to HighLevelGraph
        arr.dask.layers[pre_task] = {pre_task: (self._pre_compute,)}
        return da.Array(arr.dask, arr.name, arr.chunks, arr.dtype)

    # add "mock" argument to map_blocks function
    def _dask_block(self, _):
        if not self._open:
            raise RuntimeError("Segfault!")
        return np.random.rand(1, 4, 4)

到目前为止还不错,再也没有RuntimeError了.但是现在我已经泄露了文件句柄,因为在结束时没有任何东西关闭它。

那么,我想要的是图末尾的一个任务,它依赖于pre_task的输出(即是否必须为此计算打开文件),如果必须打开文件,则关闭该文件。

这就是我被困的地方,因为这个post-compute键会被优化器修剪.

有没有办法做到这一点,而不创建一个自定义数组子类覆盖方法,如__dask_postcompute____dask_keys__,或要求最终用户调用计算而不进行优化?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-17 15:55:53

这是一个非常有趣的问题。我认为您在编辑任务图以包括打开和关闭共享资源的任务方面是正确的。但是手工的图形操作非常繁琐,很难正确处理。

我认为实现您想要的最简单的方法是使用一些相对最近添加的实用程序在dask.graph_manipulation中进行图形操作。特别是,我认为我们需要bind (它可以用来向Dask集合添加隐式依赖项)和wait_for (它可以用来确保集合的依赖者等待另一个无关的集合)。

在修改示例时,我使用这些实用程序创建了各种to_dask(),这是自打开和关闭的:

代码语言:javascript
运行
AI代码解释
复制
import dask
import dask.array as da
import numpy as np
from dask.graph_manipulation import bind, checkpoint, wait_on


class FileReader:
    _open = False

    def open(self):
        self._open = True

    def close(self):
        self._open = False

    def to_dask(self) -> da.Array:
        # Delayed version of self.open
        @dask.delayed
        def open_resource():
            self.open()
        # Delayed version of self.close
        @dask.delayed
        def close_resource():
            self.close()
            
        opener = open_resource()
        arr = da.map_blocks(
            self._dask_block,
            chunks=((1,) * 4, 4, 4),
            dtype=float,
        )
        # Make sure the array is dependent on `opener`
        arr = bind(arr, opener)

        closer = close_resource()
        # Make sure the closer is dependent on the array being done
        closer = bind(closer, arr)
        # Make sure dependents of arr happen after `closer` is done
        arr, closer = wait_on(arr, closer)
        return arr

    def _dask_block(self):
        if not self._open:
            raise RuntimeError("Segfault!")
        return np.random.rand(1, 4, 4)

我发现在操作前后查看任务图是很有趣的。

以前,它是一个相对简单的分块数组:

但是在操作之后,您可以看到数组块依赖于open_resource,然后这些块流到close_resource中,而close_resource则让数组块进入更广阔的世界:

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

https://stackoverflow.com/questions/69967644

复制
相关文章
python使用moviepy模块对视频进行操作
前段时间需要对多个视频进行合并,还需要对一个视频按需求进行截切成多个视频,然而网上虽然有现成的工具。
狼啸风云
2020/01/14
1.6K0
Python视频编辑库:MoviePy
MoviePy是一个关于视频编辑的python库,主要包括:剪辑,嵌入拼接,标题插入,视频合成(又名非线性编辑),视频处理,和自定制效果。可以看gallery中的一些实例来了解用法。MoviePy可以读写所有的音频和视频格式,包括GIF,通过python2.7+和python3可以跨平台运行于window/Mac/Linux,下面是一个在IPython notebook的运行实例。 demo_preview.jpeg 实例
py3study
2020/01/02
2.2K0
Python使用tkinter+moviepy+pyaudio开发视频播放器
使用tkinter制作界面,播放mp4、avi视频,需要安装扩展库moviepy和pyaudio,可以参考之前推送过的文章或查阅相关资料。
Python小屋屋主
2020/05/08
1.7K0
Python使用tkinter+moviepy+pyaudio开发视频播放器
Python视频剪辑工具moviePy
关注了很多的公众号,大佬们的骚操作层出不穷,看的我跃跃欲试。也想整一下。跟在大佬们的后面好看风景(复现操作)。
云深无际
2021/04/14
2K0
Python视频剪辑工具moviePy
使用Python+moviepy连接不同尺寸的视频文件
如果直接连接多段不同尺寸的视频文件,后面几段可能会出现花屏的现象。可以使用VideoFileClip对象的resize()方法调整至相同大小,然后再进行连接就可以了。ImageFileClip对象也具有同样的resize()方法。
Python小屋屋主
2020/02/13
3.8K0
使用Python+moviepy连接不同尺寸的视频文件
创建和发布 Python 包
如果你和我一样,希望将编写的 Python 实用程序与同事共享,最好的方法是制作一个软件包:它很容易安装,而且不需要复制粘贴。
老齐
2021/04/30
9790
创建和发布 Python 包
如何发布自己的 python 包?
本文以笔者实际发布的 python 包 imgkernel 为例。因此,在本文所有出现 imgkernel 的地方,都替换成读者自己项目或包的名称。 同时,imgkernel 也托管在 github 上,后续 master 分支会更新,但是项目单独检出的 pkg 分支将保持与本文内容一致,不再改动。因此,可以将此分支 clone 下来作为新项目启动工程。clone pkg 分支的方法如下:
我是一条小青蛇
2019/10/23
6260
如何发布自己的 python 包?
moviepy,短视频生成
moviepy是一个用于视频编辑的python模块,能够实现基本的操作,比如视频的裁剪,拼接,插入标题等等 甚至还自带了一些高级的特效,以后再说。当然,gif格式的读写也在其内。
福贵
2021/01/08
1.7K0
保姆教程:构建与发布Python包
通常,如果您正在创建 Python 包,要么是因为有一些想要与他人分享的代码,要么是因为您对想要分享的东西有一定的想法。
数据科学工厂
2023/02/27
1.4K0
保姆教程:构建与发布Python包
使用dotnet Cli向nuget发布包
长话短说, 今天分享如何在nuget.org创建并发布.NET Standard package。
有态度的马甲
2020/06/10
1.2K0
python:使用moviepy合并m3u8格式的视频
视频网站或者客户端缓存下来的文件很多时候都是m3u8格式的文件,也就是拆成了很多段的视频,一个m3u8 文件实质是一个播放列表(playlist),其可能是一个媒体播放列表(Media Playlist)或者是一个主列表(Master Playlist)。
生信菜鸟团
2022/04/08
1.9K0
python:使用moviepy合并m3u8格式的视频
python也能玩视频剪辑!moviepy操作记录总结
前几篇文章咱们介绍了一下图片的处理方式,今天咱们说说视频的处理。python能够支持视频的处理么?当然是肯定的,人生苦读,我用python。万物皆可python。
菜鸟小白的学习分享
2020/07/14
1.3K0
Python包:json扩展包demjson使用
Json在编程中是一种轻量级的文件格式,在本地开发或者web开发中使用较多。参考维基百科介绍如下:
用户3578099
2020/09/22
2.9K0
Python+moviepy进行音频剪辑、拼接和格式转换
1、使用pip命令安装Python扩展库moviepy。 2、查看音频原文件的属性,尤其是比特率,下图所示是一个用手机录制的音频文件的信息 3、编写代码,截取上面音频文件中的几段,然后拼接到一起。 4
Python小屋屋主
2021/07/19
2K0
使用typescript开发angular模块(发布npm包)
创建模块 初始化package.json文件 执行命名 npm init -y 会自动生成package.json文件如下,name默认为文件夹名称 { "name": "MZC-Ng-Api", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords"
易兒善
2018/08/21
1.3K0
使用typescript开发angular模块(发布npm包)
python学习笔记5.4-包的发布
本文介绍了如何利用Python包的发布工具发布自己的Python包。主要包括了setup.py和MANIFEST.ni文件的介绍和编写,以及包安装的过程。
锦小年
2018/01/02
5730
如何使用npm发布自己的npm包
一. 创建 在npm的官网上注册一个账号,https://www.npmjs.com/ 1:在本地通过npm init 初始化一个项目,并建一个index.js 文件,因为index.js为默认进入的文件,如下: image-ab2ede5fb9d14ab8bb059eb63257c67c.png 2:在本地将该创建的项目打开,并在index.js编写想要写的文件(这里简单写一个排序),如下: image-1dc4644452b844869943897ce6cfd223.png 3:接下来通过npm
小吕
2022/06/16
1.5K0
如何使用npm发布自己的npm包
如何使用npm发布自己的npm包
一. 创建 在npm的官网上注册一个账号,https://www.npmjs.com/ 1:在本地通过npm init 初始化一个项目,并建一个index.js 文件,因为index.js为默认进入的文件,如下: 2:在本地将该创建的项目打开,并在index.js编写想要写的文件(这里简单写一个排序),如下: 3:接下来通过npm login来登录你之前创建的npm账号,如下: 4:npm pubish 二. 使用 npm install 包名 三. 版本更新 更改版本号 重新发布
小吕
2022/09/26
3.8K0
如何使用npm发布自己的npm包
提取视频中的音频——python三行程序搞定「建议收藏」
  身处数据爆炸增长的时代,各种各样的数据都飞速增长,视频数据也不例外。我们可以使用 python 来提取视频中的音频,而这仅仅需要安装一个体量很小的python包,然后执行三行程序!   语音数据在数据分析领域极为重要。比如可以分析语义、口音、根据人的情绪等等。可以应用于偏好分析、谎话检测等等。
全栈程序员站长
2022/08/26
1.5K0
提取视频中的音频——python三行程序搞定「建议收藏」
点击加载更多

相似问题

DBIx::Class和DBIx::Abstract?

19

Catalyst中的DBIx::Class升级(DBIx::Class::Schema::Loader)

11

如何修改DBIx::Class::Row?

23

DBIx::Class::ResultSet问题

10

DBIx::Class临时列

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文