【问题标题】:Python: Array vs Database for storage of key/valuePython:用于存储键/值的数组与数据库
【发布时间】:2013-07-04 14:17:51
【问题描述】:

问:对于这种情况,哪个更快?

我的场景:我的应用程序将在数组或 postgresql db 中存储链接列表,因此它可能如下所示:

1) mysite.com
   a)    /users/login
   b)    /users/registration/
   c)    /contact/
   d)    /locate/search
   e)    /priv/admin-login

1) 下的上述条目 - 我将在这些 url 上进行 string 搜索以查找例如包含以下内容的任何路径:

'login'

例如。

对于给定的域,上述字母 a) 到 e) 可能还有 5-100 个条目。

*用法:* 这种数据结构可能每天都在变化,但每天只能变化一次。一些键/值将被删除,其他的将被修改。一个单独的集合,如:

dict2 = { 'thesite.com': 123, 98.6: 37 };

每个key 将代表 1 个且仅代表 1 个域。

我尝试对此进行了一些搜索,但似乎找不到真正好的答案:何时应使用 array 以及何时应使用像 postgresql 这样的数据库?

我一直使用 db 来处理数据(使用 mysql,而不是 postgresql),但我现在正试图从现在开始做得更好,所以我想知道数组或其他数据结构在循环,并在循环时尝试匹配给定的字符串。

一如既往,谢谢!

【问题讨论】:

  • “数组”是什么意思?你是说python字典吗?这些是存储键/值映射的典型方式。 Python中也有数组,但可能不是你要找的。​​span>
  • 我认为你的意思是“列表”,你说“数组”。
  • 可能是python字典。
  • 看起来您正在尝试为 URL 开发路由模块?
  • 我们需要了解更多关于使用的信息。你有多少个网站?它们会随着时间而改变吗?您需要永久存储它们吗?你使用像 uwsgi 这样的应用容器吗?

标签: python database arrays performance postgresql


【解决方案1】:

一个完整的 SQL 数据库可能是矫枉过正。如果您可以将所有内容都放入内存中,请将其全部放入 dict 中,然后使用pickle 模块对其进行序列化并将其写入磁盘。

另一个不错的选择是使用其中一个 dbm 模块(dbm/dbm.ndbmgdbmanydbm)将数据存储在磁盘绑定哈希表中。它将有 O(1) 的查找时间,而无需像在更大的数据库中那样连接和形成查询。

edit:如果每个键有多个值并且您不想要一个成熟的数据库,SQLite 将是一个不错的选择。它已经有一个内置模块,sqlite3(在 cmets 中提到过)

【讨论】:

  • 取决于网站的 nr 以及他是否在多个盒子上使用此脚本。
  • 这是一个极好的答案。感谢您选择一方。我认为你的观点很好,尤其是最后一句话。谢谢!
  • sqlite 是一个很棒的小型数据库,并且支持许多 sql 特性
  • 是的,sqlite 也是一个不错的选择。再说一次,如果你只有键/值对,即使这样也可能是矫枉过正。
  • 如果键有多个值,例如:[keyhere] value value value,SQLLite Db 会不会好。本质上是键/值之间的 1:M 关系?
【解决方案2】:
  1. 测试它。它是您的数据集、您的硬件、您的可用磁盘和网络 IO、您的使用模式。这里没有一个真正的答案。我们甚至不知道您计划进行多少次查询 - 我们说的是每分钟一次还是每秒数千次?
  2. 如果您的数据很好地适合内存并且第一次加载不需要花费大量时间,那么将其粘贴到内存中的字典中可能会更快。
  3. 如果您一直在寻找完整的单词(例如在 login 的情况下),您也可以通过将 url 拆分为多个部分并分别对它们进行索引来获得一些速度。

【讨论】:

  • 这里很重要,尤其是#3。不过,提出这个问题的重点是根据这些信息说是否可以排除字典或 SQL 数据库的使用。我知道我总是可以测试(我会),但我想知道是否有一个显而易见的选择。欣赏这里的cmets!谢谢
猜你喜欢
  • 2013-01-31
  • 2012-11-08
  • 2010-10-13
  • 1970-01-01
  • 1970-01-01
  • 2014-11-02
  • 2015-12-18
  • 2023-03-04
  • 2013-07-24
相关资源
最近更新 更多