前言
本次最终实现了如下过程:
sources从文件夹中读取wav文件,每次读取一个文件,读到了就解析,得到文件头带的信息和多个通道的信息,返回一个map,map包含文件头带的信息和多个通道的信息。读不到就等3秒
function把map中的一个元素:map(“channel0”)
作为输入,即只接收一个通道的信息。进行fft变换后得到一个新的数组。返回
sink每接收到一个流就存储到一个新的文件中。
实现步骤:
- 解析wav文件
——使用结构一次读取,注意结构中的元素要大写 - 修改kuiper_plugin这个项目的mod,使得插件文件能够访问本地的“wav文件解析包”
- 依次创建三个go插件。
- 依次创建stream,rule.txt,rule,
测试
测试环境
包含36个相同的wav文件,文件大小:2.7M;文件名依次为:2019demo0.wav, 2019demo1.wav, …
文件信息:
直接查询结果:
在kuiper上直接查询:query
select row2fft(channel0) from streamReadWavA
读取了几个文件以后卡住了,一会后query端口输出:EOF
猜测是query端输出太多了,kuiper自己奔溃了。不过系统内存占用很低。
query端:
性能:
通过统计语句查询:
这样query端就不会打印太多消息,可以避免出现上面的错误
query端
server端
成功!
速度
36个demo的wav文件,用时42秒,
平均每1.1秒处理一个文件,每个文件从开始到输出大概2s内。
性能:
平时:
kuiper工作时:
内存增加了0.1G
主要是cpu占用高。
把结果写入txt
处理逻辑:
sources每读取一个文件,就返回读取到的信息,以及几个通道的信息
function只接收第一个通道的信息,fft,并返回
sink每收到一个流,就写入一个文件。
结果
最终6个wav文件得到了6个txt文件.每个txt大小25M,包含一个数组,内容如下:
速度
和上面差不多,一秒处理一个文件
性能
开始前后对比:
内存从2.6变为2.8 。变化不大
Cpu变化明显
错误记录:
这是我编写代码或者操作时犯的错误,稍微记录一下。
function输入是sources的输出
调用function插件时,输入时sources的输出,所以参数名要一致。
比如本文中,sources返回的map中包含4多个键值对:channel0,channel1,channel2, info,分别记录3个通道的内容和文件信息。function的作用是对某个通道的消息进行fft变换,所以调用时:row2fft(channel0)
忘记了。。
未解决的问题
- 怎么使用function同时对多个channel进行fft?
可以实现。
主要的难点是soueces传回来什么,系统默认传回来一个map,map中的每一个键对应的值都可以作为输入放入function。
可以channel数量未知,所以不知道要返回多少个channel数组,只能使用1个二维数组存放所有channel,
所以应该传回来的map中包含这样一个key-value对:channel_all-[][]float,即一个channel_all参数,包含二维数组,二维数组尺寸是通道数。
但是只传回来一个2维数组还是会丢失文件信息。 - 怎么使用function同时接收多个channel和一个info?
应该可以实现。
多个channel是[][]float, info可以是字符串或者map,想要同时返回这些,可以使用空接口数组:[]interface{},所以返回的是:
[channel [][]float , info string]
function把这个作为输入,读取第一个元素,得到2维数组,读取长度得到通道数。。。。读取第二个元素获得info信息。处理后把处理后的结果重新组合成[channel [][]float , info string],并返回这个数组。 - 问题
上面两种情况,function返回的是2维数组和interface数组,不知道sink能否接收到并输出到文件?