Python: перенести метод класса на другой компьютер
Я создал класс, который используется для анализа определенного типа данных, которые я создаю. Я использую этот класс на локальном компьютере, но иногда слишком много данных для локальной работы, поэтому я хотел добавить опцию к одному из методов, чтобы он мог передать работу в кластер компьютера. В основном это работает, за исключением того, что я пытаюсь перенести метод класса в кластер.
Мой класс выглядит так
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
для создания в кластере я сохранил статический метод (который был передан методу this, например staticMethod1
) в Pickle
использование файла dill.dump
, Pickle
Затем файл передается в кластер, но когда я пытаюсь загрузить метод из Pickle
подать ModuleNotFoundError: No module named 'analysis'
который является модулем, который Analysis
класс можно найти в.
Мне действительно нужно воссоздать весь класс в кластере, чтобы использовать статический метод? Может кто-нибудь предложить элегантное решение этой проблемы или предложить лучший способ реализации этой функциональности? Нужно работать любым статическим методом. К вашему сведению, один из статических методов использует from sklearn.metrics.cluster import adjusted_rand_score
просто если это может повлиять на решение с помощью dill
,
1 ответ
Я 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()
>>>