Python 我应该如何适应大规模数据存储和检索?

Python 我应该如何适应大规模数据存储和检索?,python,mysql,nosql,distributed-computing,large-data-volumes,Python,Mysql,Nosql,Distributed Computing,Large Data Volumes,mysql数据库中的表中有两列。第一列包含指纹,而第二列包含具有该指纹的文档列表。这很像搜索引擎建立的反向索引。表中的记录实例如下所示 34 "doc1, doc2, doc45" 指纹的数量非常大(可能高达万亿)。数据库中基本上有以下操作:插入/更新记录以及根据指纹匹配检索记录。表定义python代码段是: self.cursor.execute("CREATE TABLE IF NOT EXISTS `fingerprint` (fp BIGINT, documents TEXT)")

mysql数据库中的表中有两列。第一列包含指纹,而第二列包含具有该指纹的文档列表。这很像搜索引擎建立的反向索引。表中的记录实例如下所示

34 "doc1, doc2, doc45"
指纹的数量非常大(可能高达万亿)。数据库中基本上有以下操作:插入/更新记录以及根据指纹匹配检索记录。表定义python代码段是:

self.cursor.execute("CREATE TABLE IF NOT EXISTS `fingerprint` (fp BIGINT, documents TEXT)")
插入/更新操作的代码段为:

if self.cursor.execute("UPDATE `fingerprint` SET documents=CONCAT(documents,%s) WHERE fp=%s",(","+newDocId, thisFP))== 0L:
                self.cursor.execute("INSERT INTO `fingerprint` VALUES (%s, %s)", (thisFP,newDocId))         

到目前为止,我观察到的唯一瓶颈是mysql中的查询时间。我的整个应用程序都是基于web的。因此,时间是一个关键因素。我也想过使用卡桑德拉,但对它知之甚少。请给我一个更好的方法来解决这个问题

获取高端数据库。甲骨文有一些报价。SQL Server也可以

数以万亿计的条目远远超出了普通数据库的范围。这是非常高端非常特别的东西,特别是如果你想要体面的性能。另外,还要为其配备硬件——这意味着一台像样的中端服务器,128+gb的缓存内存,以及像样的SAN或通过SAS的足够好的DAS设置

记住,万亿意味着:

  • 每个字节使用1000gb
如果指纹存储为int64,则仅此数据的磁盘空间就为8000gb


或者你试着从一个小而便宜的服务器上运行它,它有两张2tb的光盘吗?祝你好运。

获得一个高端数据库。甲骨文有一些报价。SQL Server也可以

数以万亿计的条目远远超出了普通数据库的范围。这是非常高端非常特别的东西,特别是如果你想要体面的性能。另外,还要为其配备硬件——这意味着一台像样的中端服务器,128+gb的缓存内存,以及像样的SAN或通过SAS的足够好的DAS设置

记住,万亿意味着:

  • 每个字节使用1000gb
如果指纹存储为int64,则仅此数据的磁盘空间就为8000gb


或者你试着从一个小而便宜的服务器上运行它,它有两张2tb的光盘吗?祝你好运。

,FOC,postgres驱动,祝你好运…

,FOC,postgres驱动,祝你好运…

数据结构不太适合SQL-SQL中的“正确”设计是为每个指纹/文档对都有一行,但除非添加占用太多空间的索引,否则查询速度会非常慢。对于您尝试执行的操作,SQL会增加大量开销,以支持您不需要的函数,而不支持您确实需要的多值列

redis集群可能是一个很好的选择-原子集操作应该非常适合您所做的事情,并且通过正确的虚拟内存设置和一致的哈希来跨节点分发指纹,它应该能够处理数据量。然后,命令将被删除

SADD fingerprint, docid
添加或更新记录,以及

SMEMBERS fingerprint
以获取具有该指纹的所有文档ID

SADD是O(1)。SMEMBERS是O(n),但n是集合中的文档数,而不是系统中的文档数/指纹数,因此在这种情况下也是O(1)


您当前使用的SQL insert是O(n),n是非常大的记录总数,因为记录存储为有序列表,必须在插入时重新排序,而不是哈希表,该哈希表是get和set的固定时间。

该数据结构不太适合SQL-SQL中的“正确”设计是为每个指纹/文档对都有一行,但是,除非您添加一个占用太多空间的索引,否则查询速度将非常慢。对于您尝试执行的操作,SQL会增加大量开销,以支持您不需要的函数,而不支持您确实需要的多值列

redis集群可能是一个很好的选择-原子集操作应该非常适合您所做的事情,并且通过正确的虚拟内存设置和一致的哈希来跨节点分发指纹,它应该能够处理数据量。然后,命令将被删除

SADD fingerprint, docid
添加或更新记录,以及

SMEMBERS fingerprint
以获取具有该指纹的所有文档ID

SADD是O(1)。SMEMBERS是O(n),但n是集合中的文档数,而不是系统中的文档数/指纹数,因此在这种情况下也是O(1)


您当前使用的SQL insert是O(n),其中n是非常大的记录总数,因为这些记录存储为一个有序列表,必须在insert时重新排序,而不是一个哈希表,该哈希表是get和set的固定时间。

我希望使用免费/开源解决方案,而不是Oracle的东西。还有其他方法吗?我更愿意使用免费/开源解决方案,而不是Oracle的东西。还有别的办法吗?我当然不想花钱。。。我很想把我的廉价商品硬件和自由/开源软件发挥到极致。无论如何,谢谢你的链接:)我当然不想花钱。。。我很想把我的廉价商品硬件和自由/开源软件发挥到极致。无论如何,谢谢你的链接:)Redis需要在内存中容纳所有的数据库,有数万亿个条目,服务器的总内存量会使它无法找到。我认为另一个NOSQL数据库可以使工作变得更好,例如Tokio Cabinet、CAssandra等……这只是v1的情况——当前版本可以将数据存储在磁盘上。你仍然需要注意如何组织真正大的数据集,但对于任何数据存储来说都是如此。Redis需要在内存中容纳所有数据库,有数万亿个条目,服务器的总内存量可能会使其无法找到。我认为另一个NOSQL数据库可以