我正在开发一个Python命令行实用程序,它可能涉及对一组文件的相当大的查询。这是一个相当有限的查询列表(想想索引的数据库列)为了提高进程中的性能,我可以生成一次排序/结构化列表,映射和树,并重复点击它们,而不是点击文件系统每一次。
但是,这些缓存在进程结束时会丢失,并且每次运行脚本时都需要重建,这会大大增加程序的运行时间。我想确定在我的命令的多次执行之间共享此数据的最佳方法,这可能是并发的,一个接一个,或者执行之间有明显的延迟。
要求:
设定:
在我理想的幻想世界中,我能够直接在执行之间保留Python对象,有点像Java线程(如Tomcat请求)共享单例数据存储对象,但我意识到这可能是不可能的。我越接近那就越好。
候选人:
内存中的SQLite
SQLite本身对我的用例来说似乎不够快,因为它受磁盘支持,因此必须在每次执行时从文件中读取。也许这并不像看起来那么糟糕,但似乎有必要将数据库持久存储在内存中。 SQLite允许DB到use memory as storage,但这些DB在程序退出时被销毁,并且不能在实例之间共享。
使用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软件包似乎是一种很有前途的替代方案,可以使用多个操作系统,但这些评论意味着相当多的限制。
我知道pickle是存储Python对象的有效方式,因此它可能比任何类型的手动数据存储都具有速度优势。我可以将泡菜挂入以上任何选项吗?这会比平面文件还是SQLite更好?
我知道有很多与此相关的问题,但我做了一些挖掘工作,找不到任何关于多个命令行执行的问题。
我完全承认,我可能会过分思考这个问题。我只是试图了解我的选择,如果它们是否值得。
非常感谢你的帮助!
答案 0 :(得分:5)
我会做the simplest thing that might possibly work。 ...在你的情况下,可能只是转储到pickle文件。如果你觉得它不够快,可以尝试一些更复杂的东西(比如memcached或SQLite)。唐纳德克努特说"过早优化是所有邪恶的根源"!