我创建了一个类,用于分析我产生的特定类型的数据。我在本地计算机上使用该类,但偶尔有太多数据无法在本地工作,因此我想向其中一种方法添加一个选项,以便它可以将作业提交给计算机集群。除了我正在努力将类方法转移到集群之外,它通常都可以工作。
我的课看起来像这样
class Analysis():
def __init__(self, INPUT_PARAMETERS ETC):
self.data
OTHER_STUFF...
@staticmethod
def staticMethod1(input1, input2):
# PERFORM SOME KIND OF CALCULATION ON INPUT1 AND INPUT2 AND RETURN THE RESULT
return output
@staticmethod
def staticMethod2(input1, input2):
# PERFORM SOME KIND OF CALCULATION ON INPUT1 AND INPUT2 AND RETURN THE RESULT
return output
# MORE STATIC METHODS
@staticmethod
def staticMethodN(input1, input2):
# PERFORM SOME KIND OF CALCULATION ON INPUT1 AND INPUT2 AND RETURN THE RESULT
return output
def createArray(self, function):
# CREATE AN ARRAY BY APPLYING FUNCTION TO SELF.DATA
return array
因此调用createArray
方法,并且用户传递了应该用于计算数组的静态方法。当我想在集群上创建createArray
中的数组时,我使用{{1}将静态方法(已传递给此方法,例如staticMethod1
)保存到Pickle
文件中}。然后将dill.dump
文件传递到集群,但是当我尝试从Pickle
文件加载方法时,它说Pickle
是ModuleNotFoundError: No module named 'analysis'
类可以使用的模块找到。
我真的需要仅使用静态方法在群集上重新创建整个类吗?谁能建议一个解决此问题的优雅方法,或者提出实现此功能的更好方法?它需要使用任何静态方法。仅供参考,一种静态方法使用Analysis
,以防万一可能影响使用from sklearn.metrics.cluster import adjusted_rand_score
的解决方案。
答案 0 :(得分:0)
我是dill
的作者。 dill
可以将类方法传递给另一台计算机,如下所示。
>$ python
Python 3.5.6 (default, Sep 20 2018, 12:15:10)
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.39.2)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> class Foo(object):
... def bar(self, x):
... return self.y + x
... def __init__(self, y):
... self.y = y
...
>>> import dill
>>>
>>> f = Foo(5)
>>>
>>> with open('foo.pkl', 'wb') as pkl:
... dill.dump(f.bar, pkl)
...
>>>
然后在新会话中(或在另一台计算机上)...
>$ python
Python 3.5.6 (default, Sep 20 2018, 12:15:10)
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.39.2)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import dill
>>> with open('foo.pkl', 'rb') as pkl:
... b = dill.load(pkl)
...
>>> b(4)
9
没有您提供的更具体的代码,很难说出为什么您没有看到这种行为...但是dill
确实提供了将类定义(或只是类方法)传递给另一台计算机的功能。
这种行为可以使类似pathos
的代码将类方法传递给ParallelPool
或ProcessPool
内的另一台计算机-后者跨进程,而前者可以跨进程跨分布式资源。
dude>$ python
Python 3.5.6 (default, Sep 20 2018, 12:15:10)
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.39.2)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>> class Foo(object):
... def bar(self, x):
... return self.y + x
... def __init__(self, y):
... self.y = y
...
>>> import pathos
>>> p = pathos.pools.ParallelPool()
>>> p.map(Foo(4).bar, [1,2,3])
[5, 6, 7]
>>> p.close(); p.join()
>>>