1

在我的 svm 预测模型的实现中,我想让一个函数的执行成为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每次调用函数时函数的输出)。

4

1 回答 1

1

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

于 2013-02-15T23:28:24.423 回答