每次运行脚本时都避免加载数据库

时间:2017-01-11 01:18:30

标签: python

我写了一个Python脚本,它加载了一个user / artist / playcount数据集并预测了我可能喜欢的艺术家。但是,数据库(我下载的.tsv文件)很大,因此需要时间来读取它并将我想要的信息存储在字典中。我该如何优化呢?有没有办法保存已加载的数据库,所以每次我想做预测时我都不必再加载它?

非常感谢。

1 个答案:

答案 0 :(得分:2)

您可以使用shelve module存储和加载字典。如果创建字典的处理时间相对于将其加载到内存所花费的时间量来说很大,那么这可能会带来好处 - 也就是说,如果您的算法很复杂或字典很小。

如果您的字典仍然很大,您可以使用的一个技巧是将文件指针偏移量存储为字典值。也就是说,当您希望字典值是关于歌曲的某些信息(例如)时,不是将信息本身存储在字典中,而是将字节偏移存储在相应行开始的TSV文件中。然后,当您想要访问该信息时,打开TSV文件,搜索偏移量,读取一行,然后解析它以构造表示该歌曲的对象。寻求速度快,或者至少比阅读整个文件快得多。或者,您可以使用mmap module对文件进行内存映射,并将其有效地视为字节数组,如果您知道需要多少字节(或者至少合理地使用了多少字节),这将特别有用低上限)。

如果您想保持与其他编程语言编写的其他系统的兼容性,或者您只想要人类可读的内容,则可以使用json module将字典存储为JSON。只有你的字典不是太大,我才推荐这个。

您可以尝试的另一种解决方案是首先将字典中的信息存储在数据库中。数据库的组织方式使得访问它们的速度很快。 Python的标准库包含可用于访问SQLite数据库的sqlite3 module。这应该没问题。但是,如果您已经运行了数据库服务器,或者您有特殊需求使得使用单独的数据库服务器(例如同时访问数据库的多个进程),则可以使用SQLAlchemy在任何SQL数据库中存储和加载数据

为了完整性,我还要提到pickle module,它可以用来存储几乎任何Python对象,但我认为你不需要直接使用它。有更多简化的方法来存储和加载字典类型的数据。