繁体   English   中英

如何在不使用多个进程的情况下将 python object 保留在 RAM 中?

[英]How can I keep a python object in RAM, without using multiple processes?

我正在使用一个我无法控制的外部程序,它有时会调用我可以指定的子进程,传递一些 arguments 并在完成后检查其退出状态。

我希望该程序调用的子进程是 python 3 脚本,该脚本使用 object 执行一些计算,该 ZA8CFDE6331B666Z 构建起来非常昂贵且非常大。 因为对象的构造非常昂贵,所以我不想每次外部程序调用脚本时都构造它,而且因为它需要相当多的空间,所以每次都将它腌制到磁盘并加载它很慢。

我目前对此的解决方案是有两个进程,其中一个构造 object 并在需要时执行计算,另一个进程由外部程序调用,其唯一真正的目标是通过套接字与第一个进程通信,要求它执行任务。

第一个过程的代码大致如下:

# process1.py, performs calculations
import socket
import pickle

def do_expensive_calculations(large_object, data):
   # some expensive calculations
   return value

class LargeAndSlow:
    def __init__(self):
        # some code

if __name__ == '__main__':
    s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
    s.bind('ADDRESS')
    s.listen(1)
    
    large_object = LargeAndSlow()

    while True: 
        (conn, address) = s.accept()
        data = pickle.loads(conn.recv(4096))
        value = do_expensive_calculations(large_object, data)
        conn.send(pickle.dumps(value))

对于第二个(外部程序调用的那个)就像这样:

# process2.py
import sys
import socket
import pickle

def value_is_correct(value):
    # check if value is correct
    return is_correct

if __name__ == '__main__':
    s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
    s.connect('ADDRESS')
    s.send(pickle.dumps(sys.argv))
    
    value = pickle.loads(s.recv(4096))
    if value_is_correct(value):
        s.close()
        sys.exit(0)
    else:
        s.close()
        sys.exit(1)
            

This solution, however, is actually SLOWER than just constructing the object every time, and I suspect this is due to the overhead of having multiple python processes running simultaneously and communicating via UNIX sockets (however, I could be wrong, maybe I just coded this以一种非常低效的方式)。

有没有更快、更有效的解决方案来解决这个问题?

您可以创建一个 ram 磁盘分区并将其挂载为常规文件系统。 在 Unix 系统上,您可以为此目的使用tmpfs

从程序的角度来看,您的文件看起来就像一个普通文件。 尽管如此,操作系统会将其存储在 memory 中。

请记住,您可能(或可能不会)注意到的速度改进取决于许多因素。 I/O 可能是其中之一,而tmpfs会有所帮助。 然而,瓶颈可能是其他东西,例如酸洗/解酸过程。

如果您使用的是 Python 3.8,Python 的多处理库已经支持SharedMemory class。 它可以让多个进程直接访问同一个 memory 区域。 因此,在不同进程中移动大对象不会产生任何开销。 更多细节可以参考Python 的文档

如果您没有使用 Python 3.8,则有一个 Python package SharedArray具有类似的功能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM