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

dim*_*414 7 python command-line caching os-agnostic

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

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

要求:

  • 必须快速 - 应尽量减少任何类型的执行处理,包括磁盘IO和对象构造.
  • 必须与操作系统无关(或者至少能够在Unix/Windows上挂钩类似的底层行为,这更有可能).
  • 必须允许相当复杂的查询/过滤 - 我认为键/值映射不够好
  • 难道不是必须跟上时代的- (简述)陈旧的数据是完全正常的,这只是一个缓存,实际的数据被分别写入磁盘.
  • 不能使用重量级守护进程,如MySQL或MemCached - 我希望最小化安装成本,并要求每个用户安装这些服务太多了.

喜好:

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

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

候选人:

  • SQLite在内存中

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

  • 使用mmap将平面文件数据库加载到内存中

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

    我想我可以实现这个,如果mmap对象在退出后确实存在,但感觉非常低级,我想有人已经实现了更优雅的解决方案.我不想开始构建这个只是为了意识到我一直在重建SQLite.另一方面,感觉它会非常快,我可以根据具体的用例进行优化.

  • 使用Processing在进程之间共享Python对象

    处理包指示" 可以使用...共享内存在进程之间共享对象 ".通过其他文档,我没有看到任何进一步提及这种行为,但这听起来很有希望.谁能指导我了解更多信息?

  • 将数据存储在RAM磁盘上

    我关注的是特定于操作系统的功能,但我可以创建一个RAM磁盘,然后根据需要简单地读/写(SQLite?).该fs.memoryfs包似乎是一个有前途的替代使用多个操作系统的工作,但评论意味着相当数量的限制.

我知道pickle是存储Python对象的有效方式,因此它可能比任何类型的手动数据存储都具有速度优势.我可以将泡菜挂入以上任何选项吗?这会比平面文件还是SQLite更好?

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

我完全承认,我可能会过分思考这一点.我只想尝试一下我的选择,如果他们是值得的.

非常感谢你的帮助!

Ger*_*rat 5

我会尽可能做最简单的事情....在你的情况下,可能只是转储到pickle文件.如果你觉得它不够快,可以尝试一些更复杂的东西(比如memcached或SQLite).唐纳德克努特说:"过早优化是万恶之源"!