繁体   English   中英

将大型python对象存储在RAM中以备后用

[英]Storing large python object in RAM for later use

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

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

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

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

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

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

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

- 编辑 -

大多数操作系统还允许您将RAM作为驱动器安装。 RAM驱动器 您可以将对象写入(如尼尔建议的那样)。

我们定期加载和存储比2 Gb大得多的内存块,而无需花费任何时间(秒)。 我们可以从3年的SAN中获得350 Mb / s的速度。

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

对于数据结构,可以使用array.arraynumpy array.array更具可移植性(不涉及额外的库),但是numpy在许多方面都更加方便。 例如,您将创建一个具有1000万个元素的array.array('i') ,而不是拥有1000万个整数(python对象)。

使用元数据的最好之处在于,它是一种非常简单的格式,您可以使用c / c ++代码轻松地对其进行写入和读取。

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

我读到的一种方式是,磁盘上具有某种ASCII表示的数据结构。 您将此表示形式读入内存,然后一次或多次grep查找与给定正则表达式匹配的内容。

加快速度取决于很多相关的数据结构。

如果您只是在进行行拆分,那么也许您应该只使用一条读取指令将整个内容读取到一个字节数组中。 然后,您可以更改grep的方式以使用不跨越多行的字节数组grep。 如果您通过放置^.*?来修饰表达式以始终匹配整行^.*? 在开始时使用.*?$ ,然后在末尾使用.*?$?强制执行最小而不是最大的修改),然后您可以检查匹配表达式的大小,以找出要前进的字节数。

或者,您可以尝试使用mmap模块来实现类似的目的,而不必阅读任何内容并招致复制开销。

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

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

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

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

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

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

无论如何,那是我对这个话题的漫长讨论。 鉴于您的问题含糊不清,没有确定的答案,所以我只不过是杂乱无章的可能技术和一些指导性想法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM