【问题标题】:Efficient persistent storage for lists in PythonPython中列表的高效持久存储
【发布时间】:2015-08-29 14:21:22
【问题描述】:

我有一个(键,值)映射,其中对于每个键,我都有一个较大的异构列表列表(大约 250 个项目)。每个列表都是我可能想要迭代的字符串和数字的混合体。键是一个字符串。如果我想持久存储这样一个包含数千个这样的(键、值)对的列表以进行有效检索,那么最好的选择是什么?如果我使用 sqlite,那么我需要为每个键创建一个表,然后将列表映射到数据库中的各个记录。如果目标是快速检索特定键的列表列表,是否有更好和更有效的选择? 这是一个简短的例子。说动物是列表列表的键映射。示例数据如下所示:

 animals = { 
    "Lion" : [["Siberian", 203, "Tanzania", 123.56], ["Russian", 321, "Timbktu", 23423.2]],
    "Tiger: [["White", 121, "Australia", 1211.1], ["Indian", 111, "India", 1241.5]]
  }

因此,我希望能够保留此数据结构,并能够快速按动物名称(始终唯一)进行索引,并获取我关心的特定动物的列表列表。如果每个动物信息中的列表都是固定长度和固定字段的,我可以利用该功能以某种方式提高效率吗?

【问题讨论】:

  • 谢谢,刚看了泡菜。我可以有一个 (key1, [[], []....., []]), (key2, [[], [] ..., []] 等等的一个泡菜然后就可以了有效地检索键索引的任意记录?
  • 您想在 python 之外轻松访问原始数据吗?如果它存储在文件中,它们应该是人类可读的还是你不在乎的。
  • 我希望能够主要从 Python 访问它。我现在假设这就是我所关心的。我还在更新我的问题,以提供一个简短的示例来说明我想要什么。
  • CRUD operations 中哪一个对您最重要?
  • 阅读和更新。初始创建可能需要一些时间,但增量更新需要快速,读取需要非常快。

标签: python sqlite persistent-storage


【解决方案1】:

正如 Blender 在评论中所说,泡菜是一个合理的选择。不过,请确保不要使用原始版本,而是使用基于 C 的 cPickle。或者,考虑dill

【讨论】:

    【解决方案2】:

    我建议使用快速 JSON 库之一。网上有几个速度比较表明 JSON 可以与pickle 一样快,甚至更快。例如检查这个: http://lvsl.github.io/2011/12/28/python-serialization-benchmark.htmlhttps://blog.hartleybrody.com/python-serialize/

    有几种 JSON 序列化替代方案,同样,网上也有一些比较,例如 https://medium.com/@jyotiska/json-vs-simplejson-vs-ujson-a115a63a9e26

    我建议查看ujson,这似乎非常快,并且与例如pickle,检查数据非常容易,因为它们以人类可读的格式保存。另一方面,pickle 与自定义类型一起使用会更容易一些,尽管您仍然可以为 JSON 的自定义类型定义自定义编码器。总体而言,如果您更关心人类可读性,请选择 JSON,如果真正重要的是减少自定义类型的几行代码,请选择 JSON。

    【讨论】:

    • 感谢您的好建议,这是一个好的开始。我意识到我可能还有另一个要求……那就是获取一条记录,然后更新它并将其写回。这些工具中的大多数是否允许这种选择性更新?
    • 对于读/写一个文件,JSON 的潜在加速(在微秒的数量级,即使对于一个大而复杂的对象)并没有什么不同。如果这样做没有好处,为什么会失去使用复杂数据结构(如类和元组)的能力?
    • 另外那篇文章没有测试不同的模块属性(使用pickle.dump而不是pickle.dumps,不使用pickleHIGHEST_PROTOCOL,只使用一个非常小的对象,不测试加载性能等),所以它的结果不是很有用。
    • OP 的示例只提到了可以使用 JSON 轻松序列化的类型,所以我不会在这里称其为问题。此外,为自定义类型定义自己的编码器也没什么大不了的。
    • 另外,我不认为这些文章确实是超准确的基准,但它们确实表明 JSON 可以非常快。所以,一切都是需求问题。我确实希望能够轻松检查我的数据,例如使用文件作为跨编程环境移动数据的一种方式,例如Python/Matlab
    【解决方案3】:

    根据您的需要,您可能需要考虑REDIS,这是一个出色的键:值数据库解决方案。这个tutorial 提供了一个相对快速的介绍。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-22
      • 2013-04-27
      • 2013-01-20
      • 2022-06-15
      相关资源
      最近更新 更多