Можно ли хранить объекты Python (в частности, модели sklearn) в файлах, отображаемых в памяти?

У меня есть несколько больших объектов (моделей sklearn), которые занимают много памяти, и я хочу разделить их между несколькими процессами. Есть ли способ сделать это?

  • Это должен быть "живой" объект, а не сериализованная версия
  • Я знаю, что существует версия numpy массива с отображением в памяти, которая отвечает за значительную часть памяти модели - но их использование потребует значительных изменений в исходном коде sklearn, которые будет сложно поддерживать

1 ответ

Решение

При условии, что процессы запускаются из одного и того же скрипта Python, вот пример, который создает второй процесс и разделяет переменные между двумя процессами. Это просто, чтобы уточнить это, чтобы создать некоторое количество процессов. Обратите внимание на конструкции, используемые для создания и доступа к общим переменным и блокировки. Я вставил цикл над арифметическим процессом, чтобы сгенерировать некоторое использование процессора, чтобы вы могли отслеживать и видеть, как это работает на многоядерной или многопроцессорной платформе. Также обратите внимание на использование совместно используемой переменной для управления вторым процессом, в этом случае, чтобы сообщить ему, когда выходить. И, наконец, общий объект может быть значением или массивом, см. https://docs.python.org/2/library/multiprocessing.html

#!/usr/bin/python

from time import sleep
from multiprocessing import Process, Value, Lock

def myfunc(counter, lock, run):

    while run.value:
        sleep(1)
        n=0
        for i in range(10000):
            n = n+i*i
        print( n )
        with lock:
            counter.value += 1
            print( "thread %d"%counter.value )

    with lock:
        counter.value = -1
        print( "thread exit %d"%counter.value )

# =======================

counter = Value('i', 0)
run = Value('b', True)
lock = Lock()

p = Process(target=myfunc, args=(counter, lock, run))
p.start()

while counter.value < 5:
    print( "main %d"%counter.value )
    n=0
    for i in range(10000):
        n = n+i*i
    print( n )
    sleep(1)

with lock:
    counter.value = 0

while counter.value < 5:
    print( "main %d"%counter.value )
    sleep(1)

run.value = False

p.join()

print( "main exit %d"%counter.value)
Другие вопросы по тегам