【问题标题】:How do I store a Python object in memory for use by different processes?如何将 Python 对象存储在内存中以供不同进程使用?
【发布时间】:2011-12-12 02:24:23
【问题描述】:

情况如下:我有一个需要加载到内存中的大型对象。如此之大,以至于如果它被加载两次,它将超出我机器上的可用内存(不,我无法升级内存)。我也不能把它分成任何更小的部分。为简单起见,假设对象为 600 MB,而我只有 1 GB 的 RAM。我需要从在多个进程中运行的 Web 应用程序中使用此对象,并且我无法控制它们的生成方式(第三方负载均衡器会这样做),因此我不能仅仅依赖于创建对象在一些主线程/进程中,然后产生子进程。这也消除了使用诸如 POSH 之类的东西的可能性,因为这依赖于它自己的自定义 fork 调用。我也不能使用诸如 SQLite 内存数据库、mmap 或 posix_ipc、sysv_ipc 和 shm 模块之类的东西,因为它们充当内存中的文件,并且这些数据必须是我使用它的对象。使用其中一个,我必须将其作为文件读取,然后将其转换为每个单独进程和 BAM 中的对象,由于我只是尝试加载第二个副本,因此超出机器的内存限制导致分段错误。

必须以某种方式将 Python 对象存储在内存中(而不是作为文件/字符串/序列化/腌制)并使其可以从任何进程访问。我只是不知道它是什么。我已经查看了 StackOverflow 和 Google,但找不到答案,所以我希望有人可以帮助我。

【问题讨论】:

  • 我不确定您所说的“因为它们充当内存中的文件”是什么意思。共享内存是一块内存,而不是文件。您可以使用该内存来存储任何东西,包括对象。这在 Python 中可能不那么明显,但在 C 中却很明显。这必须是纯 Python 解决方案,还是您会考虑使用混合 Python/C 或 Python/C++ 解决方案通过 C/C++ 绑定到共享内存中的对象间接访问对象?
  • 因为这些东西确实充当内存中的文件,例如参见docs.python.org/library/mmap.html
  • Memcached for Python 之类的东西有帮助吗?
  • @DerekLitz:在 Python 中,它们就像一个文件(或一个字符串)。这意味着使用 mmap() 的 Python 程序只能读取或写入对象的序列化版本。这就是为什么我提到此限制仅特定于 Python,并且混合解决方案可能提供完全所需的功能。
  • 我明白了。你的意思是,当他说他不能时,他可以通过一些不那么明显的方式。

标签: python web memory python-internals


【解决方案1】:

http://docs.python.org/library/multiprocessing.html#sharing-state-between-processes

寻找共享内存或服务器进程。重新阅读您的帖子后,服务器进程听起来更接近您想要的。

http://en.wikipedia.org/wiki/Shared_memory

【讨论】:

  • 服务器进程部分的底部是这样的:“服务器进程管理器比使用共享内存对象更灵活,因为它们可以支持任意对象类型。此外,可以共享单个管理器通过网络上不同计算机上的进程。”这非常有趣,可能正是我所需要的,但我似乎找不到关于如何做到这一点的好的文档。搜索“python 服务器进程”会产生模糊的结果。你知道有什么好的资源吗?
  • 在回应我上一条评论时,它实际上只是在同一页面的不同部分:docs.python.org/library/… 太棒了!这对我完全有用。
【解决方案2】:

必须有某种方式将 Python 对象存储在内存中(而不是作为 文件/字符串/序列化/腌制)并可以从任何 过程。

这不是工作中的方式。 Python 对象引用计数和对象的内部指针在多个进程中没有意义。

如果数据不必是实际的 Python 对象,您可以尝试处理存储在 mmap() 或数据库等中的原始数据。

【讨论】:

    【解决方案3】:

    我会将其实现为一个 C 模块,该模块会被导入到每个 Python 脚本中。然后这个大对象的接口将用 C 或 C 和 Python 的某种组合来实现。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-21
      • 2013-01-18
      • 1970-01-01
      • 2011-05-03
      • 1970-01-01
      • 1970-01-01
      • 2010-10-17
      • 2018-03-22
      相关资源
      最近更新 更多