Python: перенести метод класса на другой компьютер - PullRequest
0 голосов
/ 28 октября 2018

Я создал класс, который используется для анализа определенного типа данных, которые я создаю.Я использую этот класс на локальном компьютере, но иногда слишком много данных для локальной работы, поэтому я хотел добавить опцию к одному из методов, чтобы он мог передать работу в кластер компьютера.В основном это работает, за исключением того, что я изо всех сил пытаюсь передать метод класса в кластер.

Мой класс выглядит так

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 Ответ

0 голосов
/ 30 октября 2018

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