2013-02-11 134 views
1

在我的svm预测模型的实现中,我想使多线程函数svmutil.svm_train的执行成为可能。虽然我对多线程程序的实现很陌生,但我对并行编程概念有一些了解,并且我认为同时在不同参数集上训练多个模型在理论上是可行的。如何使用python多线程并行处理另一个模块的某个函数而不进行酸洗?

设置:

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() 

不过,我遇到的问题是,因为它包含了一个C型svmutil.svm_train不能腌渍指针。 Python解释器给我的错误:

ValueError: ctypes objects containing pointers cannot be pickled 

我宁愿调整我的实现比pickle模块中的功能。因此,我想知道,是否有某种方法可以在不对其进行酸洗的情况下对其进行平行化处理?

另外,如何收集函数的结果?理想情况下,这将是一个训练模型列表(每次我调用该函数时函数svmutil.svm_train的输出)。

+1

这里讨论http://stackoverflow.com/questions/3288595/multiprocessing-using-pool-map-on-a-function-defined-in-a -class – jlujan 2013-02-11 22:48:47

+0

我不知道它是真的'svmutil.svm_train'还是其中一个不能被酸洗的参数? – 2013-02-12 05:46:25

回答

1

我设法使用top answer,在上面的评论链接到的问题,建立一个解决方案。我能够通过产生管道和进程并监听结果来调用外部模块中的python函数。我传入管道的功能如下:pipe.send(svmutil.svm_train(problem,param)))

相关问题