【问题标题】:Reading and writing to/from memory in Python在 Python 中读取和写入内存
【发布时间】:2010-03-23 11:37:36
【问题描述】:

让我们想象一个情况:我有两个 Python 程序。第一个将一些数据(str)写入计算机内存,然后退出。然后我将启动第二个程序,它将读取第一个程序保存的内存数据。

这可能吗?

【问题讨论】:

  • 将数据写入内存并退出?这些数据如何可靠地用于第二个程序?

标签: python memory buffer


【解决方案1】:

有点。

python p1.py | python p2.py

如果 p1 写入标准输出,则数据进入内存。如果 p2 从标准输入读取,它从内存中读取。

问题是没有“我将开始第二个程序”。您必须启动这两个程序,以便它们共享适当的内存(在这种情况下,是 stdout 和 stdin 之间的缓冲区。)

【讨论】:

    【解决方案2】:

    所有这些无意义的答案是什么?当然,您可以按照您要求的方式共享内存,除了缺少用户模式 ​​API 之外,没有任何技术原因您不应该能够持久化内存。

    在 Linux 中,您可以使用共享内存段,即使在创建它们的程序消失后仍然存在。您可以使用ipcs(1) 查看/编辑它们。要创建它们,请参阅 shmget(2) 和相关的系统调用。

    您也可以使用 POSIX 共享内存,这可能更便携。见shm_overview(7)

    我想你可以像 this 这样在 Windows 上做到这一点。

    【讨论】:

    • 忘了提及您将需要进行 C 扩展...使用 SWIG,与使用 Python C API 相比,它将为您节省大量时间。也许您应该像其他人建议的那样检查 POSH,尽管我不确定它是否会满足您的要求。
    【解决方案3】:

    使用数据库之类的东西将您的数据存储到“内存”中,例如 dbm、sqlite、shelve、pickle 等,您的第二个程序可以稍后再使用。

    【讨论】:

      【解决方案4】:

      没有。

      一旦第一个程序退出,它的内存就完全消失了。
      您需要写入磁盘。

      【讨论】:

      • 实际上,存在基于内存的文件系统(至少在 Linux 上)。该应用程序正在写入一个文件并且该文件在内存中:) 但我怀疑这就是 Honza 的意图。
      【解决方案5】:

      第一个会写一些数据 (str) 到计算机内存,然后 退出。

      然后,操作系统将确保所有内存在任何其他程序可以看到之前清零。 (这是一项重要的安全措施,因为第一个程序可能正在处理您的银行对帐单或可能已经知道了您的密码)。

      您需要写入持久存储 - 可能是磁盘。 (或者您可以使用 ramdisk,但这不太可能对实际性能产生任何影响)。

      另外,为什么你有 2 个程序?为什么不是一个程序可以同时完成这两项任务?

      【讨论】:

      • 实际上,我认为操作系统不会明确地将内存归零。不过,我可能是错的。
      • 您是正确的 SLak,您的操作系统不会将内存归零。但是你无法保证获得相同的内存,所以无论如何它都没有用。
      • 我认为您感到困惑。您的 C 运行时从操作系统获得了大量内存。这必须被清除(通常为零),否则会存在操作系统安全漏洞(假设您的内存中保存了其他用户的密码)。但是当你向 C 运行时请求一些内存时,例如通过 malloc(),该内存不会归零。您可以 malloc() 一些内存,写入它,释放它,然后再次调用 malloc() 并获得相同的内存(其中包含来自 SAME PROCESS 的一些剩余数据)。这里的 Q 是您是否可以从旧进程中看到内存;你不能。
      • “操作系统将确保所有内存在任何其他程序可以看到之前清零。”不,它可以为所欲为。 内核补丁可以将free()上的内存归零,但这仍然无法将您从被分页的内存或被交换的页表等中解救出来...... .
      【解决方案6】:

      【讨论】:

      • 你不需要这样做,Linux内核已经支持共享内存了。
      【解决方案7】:

      您还可以设置永久共享内存区域,让一个程序写入它,另一个程序读取它。但是,设置这些东西在某种程度上取决于底层的 O/S。

      【讨论】:

        【解决方案8】:

        也许张贴者在谈论共享内存之类的东西?看看这个:http://poshmodule.sourceforge.net/

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-11-12
          • 1970-01-01
          • 2019-10-09
          • 2020-04-18
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多