Python C API和数据持久化在内存中?

Posted

技术标签:

【中文标题】Python C API和数据持久化在内存中?【英文标题】:Python C API and data persistent in memory? 【发布时间】:2010-01-13 19:43:57 【问题描述】:

我正在考虑将一些 C 代码集成到 Python 系统 (Django) 中,并且我正在考虑使用 Python / C API。另一种方法是使用 IPC 进行两个独立的进程,但我首先研究的是直接交互。我是 Python 新手,所以我正在尝试了解正确的方向。

是否可以调用 C 初始化函数以 malloc 一块内存(并在其中放入一些东西)并将其句柄返回给 Python 脚本(指向内存块开头的指针) . init 函数返回后,分配的内存应保留在堆上。然后,Python 脚本可以调用后续的 C 函数(将指向内存开头的指针作为参数传递),该函数可以进行一些思考并向 Python 脚本返回一个值。最后,还有另一个 C 函数来释放内存。

假设应用程序是单线程的,并且在 init 函数之后,只读取内存,因此并发性不是问题。内存量将是几百兆字节。

这甚至可能吗? Python 会让我从堆中malloc 并让它留在那里吗?它会来自 Python 进程的内存吗? Python 会尝试清理它吗(即它是否会进行自己的内存分配,并且不会期望任何其他进程干扰其地址空间)? 我能否将字节数组作为 Python 托管字符串(或类似数据类型)返回,并将引用作为参数传递回 C 调用? Python 可以处理这么大的字符串吗? 使用单独的进程和 IPC 执行此操作会更好吗?

【问题讨论】:

【参考方案1】:

Cython

【讨论】:

谢谢。常见问题解答说它没有正式实现 Python。我对在 Cython 上运行生产 Django 网站有点谨慎是正确的吗? 这意味着它没有实现源代码分发中语法文件给出的完整 Python 语法。它仍然支持足够有用,并且与用 C 编写的模块几乎没有区别,只是它更容易编写。【参考方案2】:

您当然可以使用 C API 来做您想做的事。您将在 C 中创建一个类,它可以保存它想要的任何内存。如果您不想,那段内存根本不必暴露给 Python。

如果您喜欢构建 C DLL,并且不需要在 C 中执行 Python 操作,那么 ctypes 可能是您的最佳选择。

【讨论】:

我不会在 Windows 上工作,不确定这是否有什么不同。 (貌似是跨平台的)

以上是关于Python C API和数据持久化在内存中?的主要内容,如果未能解决你的问题,请参考以下文章

Redis

初见Redis

Redis基础--API

redis

EOS 数据库与持久化 API —— 架构

Python 随笔之Redis