繁体   English   中英

在两个python进程之间传递变量

[英]Passing variables between two python processes

我打算制作一个如下的程序结构

程序结构

PS1是一个持续运行的python程序。 PC1,PC2,PC3是客户端python程序。 PS1具有变量哈希表,每当PC1,PC2 ...要求哈希表时,PS1会将其传递给它们。

这样做的目的是将表保留在内存中,因为它是一个巨大的变量(占用10G内存),并且每次计算都非常昂贵。 将其存储在硬盘中(使用pickle或json)并在需要时每次读取它都是不可行的。 读取时间太长。

所以我想知道是否有一种方法可以将python变量永久保存在内存中 ,以便可以在需要时快速使用它。

当好的轮毂已经存在时,您正在尝试重塑方形轮毂!

让我们上一层描述您的需求:

  • 一个大数据集,建立起来很昂贵
  • 不同的过程需要使用数据集
  • 性能问题不允许简单地从永久存储中读取全套

恕我直言,我们正面临着创建数据库的目的。 对于常见用例,让许多进程全部使用其自己的10G对象副本是一种内存浪费,并且常见的方式是一个进程拥有数据,而其他进程发送对数据的请求。 您对问题的描述不够,所以我不能说最好的解决方案是:

  • 一个SQL数据库(如PostgreSQL或MariaDB),因为它们可以缓存,所以如果您有足够的内存,所有这些都将自动保存在内存中
  • 如果您唯一(或主要)需要单键访问,则使用NOSQL数据库(MongoDB等)-在处理大量需要快速但简单访问的数据时非常好
  • 使用专用查询语言的专用服务器(如果您的需求非常具体并且上述解决方案均不能满足它们)
  • 一个进程设置了巨大的共享内存,供客户端进程使用-最后一个解决方案肯定会最快地提供:
    • 所有客户端都进行只读访问-可以将其扩展为r / w访问,但可能导致同步梦night
    • 您一定要确保系统上有足够的内存以永不使用swap-如果这样做,您将失去实际数据库实现的所有缓存优化
    • 数据库的大小,客户端进程的数量以及整个系统的外部负载永远不会增加到您遇到上述交换问题的程度

TL / DR:我的建议是尝试使用高质量的数据库和可选的专用cheche来测试性能。 这些解决方案几乎可以在不同机器上实现开箱即用的负载平衡。 只有在这种方法不起作用的情况下,才能仔细分析内存需求,并确保记录客户端进程数和数据库大小的限制,以便将来维护和使用共享内存-只读数据暗示共享内存可以是一个不错的解决方案

简而言之,要实现您的要求,您需要从multiprocessing.sharedctypes模块创建一个字节数组作为RawArray,该字节数组对于PS1服务器中的整个哈希表足够大,然后将哈希表存储在该RawArray中。 PS1需要是启动PC1,PC2等的进程,然后可以继承对RawArray的访问。 您可以创建自己的对象类,该对象类提供哈希表接口,通过该接口可以访问表中的各个变量,这些变量可以分别传递给从共享RawArray读取的每个PC#进程。

暂无
暂无

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

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