【问题标题】:Processing large amounts of data quickly快速处理大量数据
【发布时间】:2011-09-30 15:56:50
【问题描述】:

我正在开发一个用户提供参数的 Web 应用程序,这些参数用于从多达 2000 万行的数据库中生成前 1000 项的列表。我需要一次所有前 1000 项,并且从用户的角度来看,我希望这个排名或多或少是瞬间发生的。

目前,我正在使用带有用户定义函数的 MySQL 对数据进行评分和排名,然后 PHP 从那里获取它。在 1M 行的数据库上进行测试,这大约需要 8 秒,但我需要大约 2 秒的性能,即使对于高达 20M 行的数据库也是如此。最好,这个数字应该更低,这样可以保证最多 50 个并发用户的良好吞吐量。

我对任何可以尽可能高效地处理这些数据的软件的进程持开放态度,无论是不是 MySQL。以下是该流程的特点和限制:

  • 与评分过程相关的每行数据约为每项 50 个字节。
  • 对数据库的插入和更新可以忽略不计。
  • 每个分数都独立于其他分数,因此可以并行计算分数。
  • 由于参数和参数值较多,无法预先计算分数。
  • 该方法应该可以很好地适应多个同时使用的用户
  • 就服务器数量而言,这需要的计算资源越少越好。

谢谢

【问题讨论】:

  • 您正在处理什么样的数据(整数、字符串等?)?你的评分算法是什么?您是否正在执行任何联接?

标签: database search parallel-processing large-data


【解决方案1】:

一种可行的方法似乎是将所有数据加载(然后更新)到大约 1GB 的 RAM 中,并在 MySQL 之外用 C++ 之类的语言执行评分和排名。那应该比 MySQL 快。

此方法的评分必须相对简单,因为您的要求仅在每行留下十分之一微秒的时间用于评分和排名,而无需并行化或优化。

【讨论】:

  • 评分算法基本上是一大堆数学,所以这似乎是可行的方法。几天前我几乎得出了这个结论,但很高兴看到它得到外部意见的证实,因为要做到这一点需要做很多工作。接下来,我需要研究如何在缓存性能、矢量化等方面最好地优化此策略。
【解决方案2】:

如果您可以发布遇到问题的查询可以提供帮助。

虽然这里有一些东西。 确保您在数据库上创建了索引。 确保使用优化查询并使用连接而不是内部查询。

【讨论】:

  • 它基本上是一个大选择,所以没有太多优化
【解决方案3】:

对于这类问题,如果您已经完成了所有明显的软件优化(我们不知道,因为您没有提及您的软件方法),您应该尝试一些严重的硬件优化。最大限度地利用 SQL 服务器上的内存,并尽可能将表放入内存中。为您的表/索引存储使用 SSD,以实现快速反序列化。如果您是集群的,请将网络加速到可行的最高网络速度。

【讨论】:

    【解决方案4】:

    根据您的标准,提高性能的可能性取决于您是否可以使用输入标准来预过滤需要计算分数的行数。 IE。如果用户提供的参数之一自动取消大部分行的资格,则首先应用该过滤将提高性能。如果没有一个参数具有该特性,那么您可能需要更多的硬件或性能更高的数据库。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-30
      • 2014-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-29
      • 1970-01-01
      • 2017-02-09
      相关资源
      最近更新 更多