2

我目前正在开发处理数十万个字符串(每个约 4000 个字符)的算法,并根据应用于这些字符串的函数的结果执行简单的操作。目前我使用 Java 和一个带有一个表的 Mysql 数据库:

 ID | String | attribute a | attribute b | ....
    |        |             |             | ....

基本上,该算法从一个 ID 开始,读取存储的字符串,对其执行功能(为当前活动的列设置和读取属性)。例如,一个函数从字符串中提取一个 ID(简单的字符串解析),将该 ID 存储在“属性 a”列中。解析条目后,算法读取“属性 a”,跳转到具有此 ID 的行,然后重新开始该过程。

也许我有点想多了;但是当前设置的开销太大,几乎不可能进行一些快速更改或快速测试查询。是否有更好的工具或编程语言被设计用于直接操作像这样的大型数据集并为字符串操作提供有效的函数?

我绝对不介意花时间学习一门全新的语言,因为我相信使用正确的工具来完成工作可以节省时间并防止长期的挫败感。

4

3 回答 3

3

我有一个宠物项目,多年来我一直在进行,断断续续地工作。它存储大量字符串(尽管不是文本)。过去,我在内存中的 Java、带有数据库的 Scala、MySQL、内存中的 C、Python + Redis ……最后是 Go 中实现了它。

Go 做得最好。我有大约 300,000 个字符串(虽然比你的短)存储在内存中的数据结构中。它们形成可搜索、可分析的数据结构。我确信用例与您的用例足够相似,因此我的经验是相关的。

Go 在数据处理方面与 C 具有相似的效率。它具有类似于 Python 的良好语法,可用于快速编码。它具有类型安全性...类型安全性。它有垃圾收集。

我的建议是,学习 Go 并在内存中完成所有操作。依靠虚拟内存来容纳大型数据集。一旦加载,我的 RAM 大约有 500 MB,但我没有任何问题,但它可以正常运行两倍。

我不坚持到磁盘,因为我不需要。我可以在 15 分钟内从输入文件重新创建数据结构。该应用程序是一个持续运行的服务器。如果您正在运行大批量操作来进行适合的分析。否则,我相信您可以轻松地保留到磁盘。

(FWIW 我说的是 www.folktunefinder.com 旋律搜索索引)

于 2012-09-06T20:27:52.890 回答
0

看起来您不需要关系数据库。也许尝试像 MongoDB 这样的东西。

于 2012-09-06T20:20:53.897 回答
0

我不认为这是一个真正的语言选择问题:您绝对可以在 Java 中进行大数据字符串处理。您可能可以通过以下方式解决大部分问题:

  • 使用受控的数据子集创建体面的 JUnit 测试
  • 进行一些分析以找到性能热点并对其进行调整
  • 内存中行/字符串的智能缓存(而不是一直往返于数据库)

话虽如此,我几乎肯定会选择 Clojure 作为此类任务的语言/环境:

  • 在 REPL 进行交互式开发,用于测试查询等。
  • 比Java简洁多了
  • 惰性函数式编程非常适合大数据集(即使是大于内存的数据集)
  • 您仍然可以访问所有 J​​ava 库
  • 一些非常简洁的数据库工具,例如Korma(一种用于 SQL 查询的 DSL)和Datomic(一种革命性的新型数据库)
于 2012-09-07T03:26:13.653 回答