2

对于我的日常工作,我的任务是建立一个计算机系统来对一个大型字符串数据库进行计算。我已经建立了概念验证,但没有优化硬件和软件环境的底层知识。我希望在这方面得到一些指导。

设置:

  • 包含字符串的数据库中的 100,000 条记录
  • 我将执行字符串相似度计算以查找近似重复项
    • 即每个字符串对每个其他字符串,所以约 50 亿次计算
  • 我使用 SQLite3 作为数据库,使用 1000 个样本行在 Ruby 中编写了概念证明
  • 整个工作应该在几天内完成——越快越好,但收益会递减。这是一次性通行证,所以如果桌面设置可以在几天内完成,我不需要超级计算机

我在寻找什么:

  • 如果我正在构建一个自定义盒子来运行这项工作(以及未来可能具有类似性质的工作),我应该专注于优化哪些硬件?即我应该把有限的预算花在速度非常快的 GPU 上吗?中央处理器?大量内存?我对 Ruby 的了解不够低,无法知道此类操作的瓶颈在哪里
  • 我错过了更好的方法吗?至少在我能证明这种方法适用于这种运行方式之前,我不会批准购买任何主要的软件或昂贵的硬件。但是任何人都可以提出一种更有效的检测不精确重复的方法吗?
4

3 回答 3

4

首先,现在 100,000 个字符串并不能真正成为一个大型数据集,所以不要太担心硬件。以下是我之前的工作(与搜索和机器翻译相关)以及我一直在处理数十万到数百万条 XML 记录的当前工作的一些建议:

  • 你想要内存。很多。
  • 正如 Soren 所说,你要确保你的算法是好的。
  • 明智地选择您的数据库。例如,Postgres 具有出色的字符串函数,直接在数据库中执行某些操作会非常快。我说过你想要很多内存吗?
  • 您的工作听起来很容易划分为可以并行处理的较小子任务。如果确实如此,您可能需要查看MapReduce。在之前的工作中,我们有相当不错的工作站(4 核,8 GB RAM),它们从未关闭过,因此我们将其中的一些变成了一个 Hadoop 集群,可以做一些有用的事情。由于这些机器无论如何都无法满足日常工作使用,因此用户甚至都没有注意到。将某些东西变成 MapReduce 作业通常并不难,另一个优点是您可以保留设置以用于将来类似的任务。
  • 至于 Ruby 特定的瓶颈,MRI 中最大的瓶颈通常是垃圾收集,这要归功于它的 stop-the-world 特性,速度非常慢。当我们进行分析时,这通常会成为一个问题。有关 Ruby GC 的详细信息,请参阅为什么的文章The fully upturned bin。如果您打算使用 Ruby,您可能希望将 MRI 与 JRuby 进行比较,根据我对后者和 JVisualVM 等分析器的经验,如果 JRuby 表现更好,我不会感到惊讶。
于 2011-07-22T07:17:43.487 回答
2

整个工作应该在几天内完成......
这是一次性通行证......
我错过了更好的方法......

如果这是一次性任务,你真的应该在亚马逊上运行它——买一台超大(4Core,15GB RAM)机器几个小时,然后在那里运行它。

于 2011-07-22T17:31:00.433 回答
1

您的字符串相似性算法比您的硬件规格重要得多。

关于字符串相似性算法的关键问题是“你什么时候期望字符串相似?” 您是否考虑子字符串、拼写错误、语音、打字错误。

这个SO 链接对算法有很好的讨论。100,000 条记录实际上是非常少的数据(在我的世界中),但为了便于实施,一旦你有了一个好的算法,你应该尝试获得尽可能多的 RAM。从性能角度来看,在 Ruby 中执行此操作也可能不是最佳选择。

于 2011-07-22T05:30:03.763 回答