您的问题描述有点模糊,可以通过几种不同的方式阅读。
我阅读本文的一种方式是,您在磁盘上有某种数据结构的 ASCII 表示。你将这个表示读入内存,然后用 grep 一次或多次查找与给定正则表达式匹配的内容。
加快速度很大程度上取决于所讨论的数据结构。
如果您只是简单地进行行拆分,那么也许您应该使用单个读取指令将整个内容读入一个字节数组。然后,您可以更改 grep 的方式以使用不跨越多行的字节数组 grep。^.*?
如果您通过在开头和.*?$
结尾放置表达式来始终匹配整行(?
强制最小而不是最大咀嚼),那么您可以检查匹配表达式的大小以找出要向前移动的字节数。
或者,您可以尝试使用该mmap
模块来实现类似的功能,而无需阅读任何内容并产生复制开销。
如果要进行大量处理来创建数据结构,并且您想不出一种方法以非常原始的方式将文件中的数据用作简单的字节数组,那么您将获得各种其他解决方案取决于,尽管这些听起来像创建一个守护进程是最好的选择。
由于您的基本操作似乎是“告诉我哪些表条目与正则表达式匹配”,因此您可以使用xmlrpc.server
和xmlrpc.client
库来简单地包装一个调用,该调用将正则表达式作为字符串并以任何自然形式返回结果。该库将负责将看起来像函数调用的东西通过套接字或其他任何东西包装成消息的所有工作。
现在,您将其实际保存在内存中的想法有点牵强附会。我认为这些天从磁盘读取 2G 的信息不需要 30 分钟。它可能最多需要 5 个,并且可能少于 1 个。因此,您可能想看看如何构建数据结构,看看是否可以优化它。
pickle 和/或 marshal 将为您购买的是高度优化的代码,用于从序列化形式构建数据结构。这将导致数据结构的创建可能会受到磁盘读取速度的限制。这意味着您要解决的真正问题不是每次都从磁盘读取它,而是在您自己的地址空间中构建数据结构。
将它保存在内存中并使用守护进程并不能保证它会保留在内存中。它只是保证它在 Python 进程的地址空间中保持为您想要的数据结构。操作系统可能随时决定将该内存交换到磁盘。
同样,这意味着关注从磁盘读取它的时间可能不是正确的焦点。相反,专注于如何在 Python 进程的地址空间中有效地重新创建(或保留)数据结构。
无论如何,这是我对这个话题的啰嗦。鉴于你的问题含糊不清,没有明确的答案,所以我只是给出了一些可能的技术和一些指导思想的大杂烩。