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

时间:2017-01-25 05:34:21

标签: python variables memory python-object

我打算制作一个类似下面的程序结构

Program Structure

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

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

所以我想知道是否有办法 在内存中持久保存python变量 ,因此无论何时需要它都可以非常快速地使用它。

2 个答案:

答案 0 :(得分:1)

当你已经存在漂亮的圆形轮时,你正试图重新发明方形轮!

让我们按照你描述自己需求的方式提升一级:

  • 一个大型数据集,构建成本高昂
  • 不同的流程需要使用数据集
  • 性能问题不允许简单地从永久存储中读取全套
恕我直言,我们正面临着为其创建数据库的问题。对于常见用例,让许多进程都使用自己的10G对象副本是一种内存浪费,常见的方法是一个进程拥有数据,其他进程发送数据请求。你没有充分描述你的问题,所以我不能说最好的解决方案是:

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

TL / DR:我的建议是通过高质量的数据库和可选的专用chache来试验性能。这些解决方案允许在不同的机器上几乎开箱即用的负载平衡。只有在不能正常工作的情况下才能仔细分析内存需求,并确保记录客户端进程数量和数据库大小的限制,以便将来维护和使用共享内存 - 只读数据是共享内存的一个提示可以是一个很好的解决方案< / p>

答案 1 :(得分:0)

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