【问题标题】:Is it possible to store python objects (specifically sklearn models) in memory mapped files?是否可以将 python 对象(特别是 sklearn 模型)存储在内存映射文件中?
【发布时间】:2016-06-04 20:53:36
【问题描述】:

我有几个占用大量内存的大型对象(sklearn 模型),我想在多个进程之间共享它们。 有没有办法做到这一点?

  • 它必须是“实时”对象,而不是序列化版本
  • 我知道有一个内存映射版本的 numpy 数组,它负责模型内存的重要部分 - 但使用它们需要对 sklearn 源代码进行重大更改,这将很难维护

【问题讨论】:

  • 你能举个具体的例子吗?哪些模型属性占用大量内存?
  • 视情况而定。一个主要问题是文本矢量化模型中的词汇表。
  • 你在使用稀疏矩阵吗?
  • 我不知道......如果没有具体的测试用例,很难提出任何具体的建议(你甚至还没有提到你指的是哪种模型)。如果您提供了MCVE,那么您将有更好的机会获得有用的答案。
  • 你还需要这个问题的答案吗?如果是这样,请告诉我您的意思是(a)在不同时间运行的进程之间共享对象,还是(b)在同一台计算机上同时运行。请选择a或b。

标签: python scikit-learn shared-memory memory-mapped-files


【解决方案1】:

在进程从同一个 python 脚本启动的条件下,这里是一个创建第二个进程并在两个进程之间共享变量的示例。很容易对此进行详细说明以创建一些流程。注意用于创建和访问共享变量和锁的结构。我在算术进程上插入了一个循环以生成一些 cpu 使用率,以便您可以监视并查看它是如何在多核或多处理器平台上运行的。还要注意使用共享变量来控制第二个进程,在这种情况下告诉它何时退出。最后,共享对象可以是一个值或一个数组,见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)

【讨论】:

  • TL;DR - 这不使用内存映射文件,而是基于预定义进程的分叉共享内存。虽然这可能不太理想(有时会复制分叉的 python 内存 - 例如因为更改引用计数),但它可能是最好的“非侵入式”解决方案
  • 谢谢。这就是我想要的。希望能帮助到你。 B'hatzlocha
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-24
  • 1970-01-01
  • 2021-04-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多