我正在开发一个我想使用TPL Dataflow构建的音频处理工具。
数据流本身将包括在声音处理块之间传递的音频样本。这些样本的大小通常为几Kb(float[]
/ byte[]
,具有1k至4k元素。
因此,数据流是一个简单的管道,如下所示:
SourceBlock<byte[]>
-> TransformBlock<byte[], float[]>
-> TransformBlock<float[], float[]>
-> ...
某些块可以纯粹“就地”工作,即通过改变输入数据,而其他块必须创建新样本。每个块的处理时间可能因输入数据而异。
我不想一直分配新的数组,而是依靠垃圾收集器来处理对象的回收。 我希望从块的并发执行中受益,因此不希望限制链顺序处理数据(在这种情况下,我不需要TPL)。 我不需要处理块来运行并发处理(在任何给定时间,每个块最多只有一个进程)。
在给定时间控制管道中样品数量并回收不再使用的样品/阵列的最佳方案是什么?
答案 0 :(得分:1)
如果您的目标是重复使用数组而不是始终创建新数组并让GC收集它们,则需要使用ObjectPool:
对象池模式是一种软件创建设计模式,它使用一组准备好使用的初始化对象 - 一个&#34;池&#34; - 而不是按需分配和销毁它们。池的客户端将从池中请求对象并对返回的对象执行操作。当客户端完成后,它将对象返回池而不是销毁它;这可以手动或自动完成。
不幸的是,您可能需要自己实现它并使其成为线程安全的。