是否可以在内存映射文件中存储python对象(特别是sklearn模型)?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了是否可以在内存映射文件中存储python对象(特别是sklearn模型)?相关的知识,希望对你有一定的参考价值。

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

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

在从相同的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)

以上是关于是否可以在内存映射文件中存储python对象(特别是sklearn模型)?的主要内容,如果未能解决你的问题,请参考以下文章

持久化和对象关系映射

是否有任何 C 或 C++ 标准识别内存映射文件的存在?

内存映射文件 IList 实现,用于“在内存中”存储大型数据集?

ORM(Object Relational Mapping:对象关系映射)

是否可以使用 python 将磁盘上的不连续数据映射到数组?

如果存储在指针映射中,是不是需要删除对象?