python - 创建在执行之间持续存在的内存缓存

标签 python caching command-line os-agnostic

我正在开发一个 Python 命令行实用程序,它可能涉及对一组文件的相当大的查询。这是一个合理有限的查询列表(想想索引数据库列)为了提高进程中的性能,我可以生成排序/结构化列表、 map 和树一次,并重复点击它们,而不是每次都点击文件系统。

但是,这些缓存在进程结束时会丢失,并且每次脚本运行时都需要重新构建,这大大增加了我的程序的运行时间。我想确定在我的命令的多次执行之间共享此数据的最佳方式,这可能是并发的,一个接一个的,或者在执行之间有显着延迟。

要求:

  • 必须很快——任何类型的每次执行处理都应该被最小化,这包括磁盘 IO 和对象构造。
  • 必须与操作系统无关(或者至少能够在 Unix/Windows 上 Hook 类似的底层行为,这更有可能)。
  • 必须允许相当复杂的查询/过滤 - 我认为键/值映射不够好
  • 是否不是 需要是最新的 - (简而言之)陈旧数据完全没问题,这只是一个缓存,实际数据被单独写入磁盘。
  • 不能使用重量级的守护进程,比如 MySQL 或 MemCached - 我想最小化安装成本,要求每个用户安装这些服务太多了。

  • 喜好:
  • 如果可能的话,我想完全避免任何长时间运行的守护进程。
  • 虽然我希望能够快速更新缓存,但在更新时重建整个缓存并不是世界末日,快速读取比快速写入重要得多。

  • 在我理想的幻想世界中,我可以在执行之间直接保留 Python 对象,有点像共享单例数据存储对象的 Java 线程(如 Tomcat 请求),但我意识到这可能是不可能的。不过,我越接近那个越好。

    应聘者:
  • 内存中的 SQLite

    SQLite 本身对于我的用例来说似乎不够快,因为它由磁盘支持,因此每次执行时都必须从文件中读取。也许这并不像看起来那么糟糕,但似乎有必要将数据库持久存储在内存中。 SQLite 允许数据库到 use memory as storage但是这些数据库在程序退出时被销毁,并且不能在实例之间共享。
  • 使用 mmap 加载到内存中的平面文件数据库

    在频谱的另一端,我可以将缓存写入磁盘,然后使用 mmap 将它们加载到内存中,可以在不同的执行之间共享相同的内存空间。但是,如果所有进程都退出,我不清楚 mmap 会发生什么。如果 mmap 最终从内存中刷新也没关系,但我希望它保留一点(30 秒?几分钟?),以便用户可以一个接一个地运行命令,并且可以重用缓存。 This example似乎暗示需要有一个开放的 mmap 句柄,但我没有找到任何关于何时从内存中删除内存映射文件并需要从磁盘重新加载的确切描述。

    我想我可以实现这个,如果 mmap 对象在退出后仍然存在,但感觉非常低级,我想有人已经实现了更优雅的解决方案。我不想开始构建它只是为了意识到我一直在重建 SQLite。另一方面,感觉它会非常快,我可以根据我的特定用例进行优化。
  • 使用 Processing 在进程之间共享 Python 对象

    处理包指示“Objects can be shared between processes using ... shared memory”。浏览其余的文档,我没有看到任何关于这种行为的进一步提及,但这听起来很有希望。任何人都可以指导我了解更多信息吗?
  • 将数据存储在 RAM 磁盘上

    我在这里担心的是特定于操作系统的功能,但我可以 create a RAM disk然后按照我的意愿简单地读/写它(SQLite?)。 fs.memoryfs package 似乎是与多个操作系统一起工作的有前途的替代方案,但评论暗示了相当多的限制。

  • 我知道 pickle是一种存储 Python 对象的有效方式,因此它可能比任何类型的手动数据存储具有速度优势。我可以将泡菜 Hook 到上述任何选项中吗?那会比平面文件或 SQLite 更好吗?

    我知道有很多与此相关的问题,但我做了一些挖掘,但找不到任何直接解决我关于多个命令行执行问题的问题。

    我完全承认,我可能想多了。我只是想感受一下我的选择,以及它们是否值得。

    非常感谢你的帮助!

    最佳答案

    我只想做 the simplest thing that might possibly work . ...在您的情况下,这可能只是转储到泡菜文件中。如果您发现它不够快,请尝试更复杂的东西(例如 memcached 或 SQLite)。 Donald Knuth 说“过早的优化是万恶之源”!

    关于python - 创建在执行之间持续存在的内存缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10963125/

    相关文章:

    python - Sympy 简化逻辑

    python - 读取制表符分隔的 ASCII 数据,变量由空行分隔

    command-line - 在awk中使用多个字段分隔符重命名多个文件

    java - Spring 可缓存注释在部署完成之前不起作用

    c++ - 缓存行中存储了多少数组?

    linux - Jupyter Notebook URL 的 token 在 Ubuntu 上的 Docker 镜像中被截断

    linux - 如何为 linux/unix 命令分配 RAM 和堆空间?

    python - 如何计算字符串中的位数

    Python PDF缩略图预览生成

    caching - 如何在 Rascal MPL 中序列化/反序列化数据到文件