0

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

程序结构

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

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

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

4

2 回答 2

1

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

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

  • 一个大型数据集,构建成本很高
  • 不同的流程需要使用数据集
  • 性能问题不允许简单地从永久存储中读取完整集

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

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

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

于 2017-01-25T07:33:24.433 回答
0

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

于 2017-01-25T05:58:25.663 回答