在我的支持向量机预测模型的实现中,我想让函数svmutil.svm_train的执行多线程。虽然我是多线程程序实现的新手,但我对并行编程概念有一定的了解,我相信同时训练具有不同参数集的多个模型在理论上是可能的。
设置:
import svmutil
import multiprocessing as mp
problem = svm_util.svm_read_problem('my_problem')
# I have a list of svm_param objects I want to train
params = myCode.svm_param_list()
# Calculate the number of worker threads
processes = mp.cpu_count() * 2将训练分成多个执行线程:
pool = mp.Pool(processes)
for param in params:
pool.apply(svmutil.svm_train, args=(problem, param,))
pool.close()
pool.join()然而,我遇到的问题是svmutil.svm_train不能被酸洗,因为它包含一个c类型的指针。python解释器给我的错误是:
ValueError: ctypes objects containing pointers cannot be pickled我宁愿调整我的实现,而不是以某种方式在模块中的函数。因此,我想知道,有没有什么方法可以让我并行化这个函数而不对它进行酸洗呢?
另外,我如何收集函数的结果?理想情况下,这应该是一个经过训练的模型列表(我每次调用函数时svmutil.svm_train函数的输出)。
发布于 2013-02-16 07:28:24
在上面评论中链接到的问题中,我设法使用了top answer来构建解决方案。通过生成管道和进程并监听结果,我能够在外部模块中并行调用python函数。我传递给管道的函数如下:pipe.send(svmutil.svm_train(problem,param)))
https://stackoverflow.com/questions/14822313
复制相似问题