2

是否可以将 python(或 C++)数据存储在 RAM 中以供以后使用,如何实现?

背景: 我编写了一个程序来查找输入表中的哪些行与给定的正则表达式匹配。我可以在大约一秒或更短的时间内找到所有的行。然而问题是我每次启动这个程序时都会将输入表处理成一个 python 对象。这个过程大约需要 30 分钟。

该程序最终将在 RAM 超过 128GB 的​​机器上运行。python 对象需要大约 2GB 的 RAM。输入表很少更改,因此 python 对象(我目前每次都在重新计算)实际上很少更改。有没有一种方法可以让我创建一次这个 python 对象,将它存储在 RAM 24/7 中(如果输入表更改或服务器重新启动,则重新创建),然后每次需要时都使用它?

注意:python 对象在创建后不会被修改。但是,如果需要,我需要能够重新创建此对象。

编辑:我能想到的唯一解决方案就是让程序 24/7 运行(作为守护进程??),然后根据需要向它发出命令。

4

4 回答 4

2

您可以尝试腌制您的对象并将其保存到文件中,这样每次程序运行时它只需反序列化对象而不是重新计算它。希望服务器的磁盘缓存在必要时保持文件热。

于 2012-12-17T00:10:01.323 回答
2

要将任何内容存储在 RAM 中,您需要一个正在运行的进程。因此,最简单的解决方案是实现您在编辑中编写的内容。您还可以创建一个始终运行的新进程,并让旧进程连接到新进程以获取数据。如何连接取决于您。您可以使用共享内存或 TCP/IP 套接字。TCP/IP 具有允许数据可通过网络访问的优势,但请确保其安全。

- 编辑 -

大多数操作系统还允许您安装一定速度的 RAM 作为驱动器。一个RAM 驱动器。你可以写(像尼尔建议的那样)对象。

于 2012-12-17T08:21:39.307 回答
2

我们定期加载和存储比 2 Gb 大得多的内存块(秒)。我们可以从使用 3 年的 SAN 获得 350 Mb/s。

瓶颈/开销似乎主要涉及 python 对象管理。我发现使用 marshal 比 cPickle 快得多。结合使用涉及最少 python 对象句柄的数据结构,这已经足够快了。

对于数据结构,您可以使用array.arraynumpyarray.array更便携(不涉及额外的库),但numpy在许多方面更方便。例如,您将创建一个array.array('i')包含 1000 万个元素的单个整数,而不是 1000 万个整数(python 对象)。

使用 marshal 最好的部分是它是一种非常简单的格式,您可以使用 c/c++ 代码轻松地写入和读取。

于 2012-12-18T00:29:49.553 回答
0

您的问题描述有点模糊,可以通过几种不同的方式阅读。

我阅读本文的一种方式是,您在磁盘上有某种数据结构的 ASCII 表示。你将这个表示读入内存,然后用 grep 一次或多次查找与给定正则表达式匹配的内容。

加快速度很大程度上取决于所讨论的数据结构。

如果您只是简单地进行行拆分,那么也许您应该使用单个读取指令将整个内容读入一个字节数组。然后,您可以更改 grep 的方式以使用不跨越多行的字节数组 grep。^.*?如果您通过在开头和.*?$结尾放置表达式来始终匹配整行(?强制最小而不是最大咀嚼),那么您可以检查匹配表达式的大小以找出要向前移动的字节数。

或者,您可以尝试使用该mmap模块来实现类似的功能,而无需阅读任何内容并产生复制开销。

如果要进行大量处理来创建数据结构,并且您想不出一种方法以非常原始的方式将文件中的数据用作简单的字节数组,那么您将获得各种其他解决方案取决于,尽管这些听起来像创建一个守护进程是最好的选择。

由于您的基本操作似乎是“告诉我哪些表条目与正则表达式匹配”,因此您可以使用xmlrpc.serverxmlrpc.client库来简单地包装一个调用,该调用将正则表达式作为字符串并以任何自然形式返回结果。该库将负责将看起来像函数调用的东西通过套接字或其他任何东西包装成消息的所有工作。

现在,您将其实际保存在内存中的想法有点牵强附会。我认为这些天从磁盘读取 2G 的信息不需要 30 分钟。它可能最多需要 5 个,并且可能少于 1 个。因此,您可能想看看如何构建数据结构,看看是否可以优化它。

pickle 和/或 marshal 将为您购买的是高度优化的代码,用于从序列化形式构建数据结构。这将导致数据结构的创建可能会受到磁盘读取速度的限制。这意味着您要解决的真正问题不是每次都从磁盘读取它,而是在您自己的地址空间中构建数据结构。

将它保存在内存中并使用守护进程并不能保证它会保留在内存中。它只是保证它在 Python 进程的地址空间中保持为您想要的数据结构。操作系统可能随时决定将该内存交换到磁盘。

同样,这意味着关注从磁盘读取它的时间可能不是正确的焦点。相反,专注于如何在 Python 进程的地址空间中有效地重新创建(或保留)数据结构。

无论如何,这是我对这个话题的啰嗦。鉴于你的问题含糊不清,没有明确的答案,所以我只是给出了一些可能的技术和一些指导思想的大杂烩。

于 2012-12-18T07:30:03.023 回答