在Python中分析来自连续输入流(记录)的数据,多处理?

在Python中分析来自连续输入流(记录)的数据,多处理?,python,multiprocessing,audio-recording,Python,Multiprocessing,Audio Recording,我正在分析用麦克风实时录制的数据。到目前为止,我一直在以线性方式进行此操作: 记录1秒(需要1秒) 分析数据(以50毫秒为例) 记录一秒钟 分析数据 等等。这显然意味着,当我在分析前一秒的数据时,我失去了这50毫秒的时间,在此期间我不会录制声音 我认为多处理将是解决方案:我启动一个单独的进程,不间断地记录特定长度的数据块,每次通过管道将其发送到主进程,然后主进程分析数据。不幸的是,通过管道发送大量数据(或者通常,从一个进程向另一个进程发送大量数据)显然远远不够理想。还有别的办法吗?我只想让我

我正在分析用麦克风实时录制的数据。到目前为止,我一直在以线性方式进行此操作:

  • 记录1秒(需要1秒)
  • 分析数据(以50毫秒为例)
  • 记录一秒钟
  • 分析数据
等等。这显然意味着,当我在分析前一秒的数据时,我失去了这50毫秒的时间,在此期间我不会录制声音

我认为多处理将是解决方案:我启动一个单独的进程,不间断地记录特定长度的数据块,每次通过管道将其发送到主进程,然后主进程分析数据。不幸的是,通过管道发送大量数据(或者通常,从一个进程向另一个进程发送大量数据)显然远远不够理想。还有别的办法吗?我只想让我的计算机在分析数据的同时记录数据并将其导入python(所有这些我都已经在做了)

如果我需要添加更多细节,请告诉我


谢谢

简单的生产者/消费者实施

确实,来回移动数据会导致开销并增加内存使用,但只要多个进程不需要相同的数据,开销就最小。试试看:)可以通过更改队列和池大小数字来调整内存占用

线程化是减少内存使用的另一种选择,但代价是在GIL上被阻塞,如果处理是在python字节码中,则实际上是单线程的

import multiprocessing
# Some fixed size to avoid run away memory use
recorded_data = multiprocessing.Queue(100)

def process(recorded_data):
    while True:
        data = recorded_data.get()
        <process data>

def record(recorded_data):
    for data in input_stream:
        recorded_data.put(data)

producer = multiprocessing.Process(target=record, 
                                   args=(recorded_data,))
producer.start()

# Pool of 10 processes
num_proc = 10
consumer_pool = multiprocessing.Pool(num_proc)
results = []
for _ in xrange(num_proc):
    results.append(
      consumer_pool.apply_async(process,
                                args=(recorded_data,)))

producer.join()

# If processing actually returns something
for result in results:
    print result
# Consumers wait for data from queue forever
#  so terminate them when done
consumer_pool.terminate()
导入多处理
#一些固定的大小,以避免失控的内存使用
记录的数据=多处理队列(100)
def过程(记录的数据):
尽管如此:
数据=记录的数据。获取()
def记录(记录的数据):
对于输入_流中的数据:
记录的数据。输入(数据)
生产者=多处理。过程(目标=记录,
args=(记录的数据,)
producer.start()
#10个进程池
num_proc=10
消费者池=多处理池(num\u proc)
结果=[]
对于xrange中的u(num_proc):
结果.append(
消费者池。应用异步(进程,
args=(记录的数据)
producer.join()
#如果处理实际上返回了一些东西
对于结果中的结果:
打印结果
#消费者永远等待队列中的数据
#因此,完成后终止它们
消费者池终止()

您的一些实际代码会很有用。谢谢!我尝试了类似的方法,但以process()作为主进程。出于某种原因,将数据从record()进程推送到主进程的速度很慢(我使用了一个管道,因为我显然只有一个process()进程要发送到它。管道会有任何问题吗?)。我将在考虑您的情况下再次检查我的实现,看看是什么解决了问题。:)是的,multiprocess.pipe将比使用共享队列慢。有了管道,对象每次都需要序列化和反序列化,并通过网络接口传递,而网络接口有其自身的开销。序列化仍然需要在队列中进行,这就是为什么本机对象不能放在多处理队列中(但可以使用线程模块),但网络开销不存在的原因。