【问题标题】:What should i do for accommodating large scale data storage and retrieval?我应该怎么做才能适应大规模数据存储和检索?
【发布时间】:2011-06-01 09:48:13
【问题描述】:

mysql 数据库中的表中有两列。第一列包含指纹,而第二列包含具有该指纹的文档列表。它很像搜索引擎构建的倒排索引。表中记录的一个实例如下所示;

34 "doc1, doc2, doc45"

指纹数量非常庞大(可达数万亿)。数据库中基本上有以下操作:插入/更新记录和根据指纹匹配检索记录。表定义python sn -p 为:

self.cursor.execute("CREATE TABLE IF NOT EXISTS `fingerprint` (fp BIGINT, documents TEXT)")

插入/更新操作的sn-p是:

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 中的查询时间。我的整个应用程序都是基于网络的。所以时间是一个关键因素。我也想过使用 cassandra,但对它的了解较少。请建议我一个更好的方法来解决这个问题。

【问题讨论】:

    标签: python mysql nosql distributed-computing large-data-volumes


    【解决方案1】:

    获取高端数据库。甲骨文有一些优惠。 SQL Server 也是如此。

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

    记住,TRILLIONS 的意思是:

    • 每个字节使用 1000gb。

    如果指纹存储为 int64,则仅此数据就有 8000gb 磁盘空间。

    或者您是否尝试从带有几张 2tb 磁盘的小型廉价服务器上运行它?祝你好运。

    【讨论】:

    • 我更愿意使用免费/开源解决方案,而不是 Oracle 的东西。有没有其他办法?
    【解决方案2】:

    这种数据结构不太适合 SQL - SQL 中的“正确”设计是为每个指纹/文档对设置一行,但查询速度会非常慢,除非您添加一个会占用空间太大。对于您正在尝试做的事情,SQL 增加了很多开销来支持您不需要的功能,同时不支持您确实需要的多值列。

    Redis 集群可能非常适合 - 原子集操作应该非常适合您正在做的事情,并且通过正确的虚拟内存设置和一致的哈希来在节点之间分配指纹,它应该能够处理数据量.然后命令将是

    SADD fingerprint, docid
    

    添加或更新记录,以及

    SMEMBERS fingerprint
    

    获取具有该指纹的所有文档 ID。

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

    您当前使用的 SQL 插入是 O(n),其中 n 是非常大的记录总数,因为记录存储为有序列表,必须在插入时重新排序,而不是恒定时间的哈希表获取和设置。

    【讨论】:

    • Redis 需要在内存中装下所有的数据库,数以万亿计的条目,服务器的总内存量是无法承受的。我认为另一个 NOSQL 数据库可以使工作更好,例如 Tokio Cabinet、CAssandra 等...
    • 这只是 v1 的情况 - 当前版本可以将数据存储在磁盘上。您仍然必须小心如何为非常大的数据集组织事物,但这对于任何数据存储都是如此。
    【解决方案3】:

    Greenplum data warehouse,FOC,postgres 驱动,祝你好运...

    【讨论】:

    • 赚钱当然不是我的选择……我很想从我的廉价商品硬件和 FOSS 中发挥最大的作用。无论如何感谢您的链接:)
    猜你喜欢
    • 2012-02-03
    • 1970-01-01
    • 2012-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-03
    • 2018-12-30
    相关资源
    最近更新 更多