1

我正在寻找一种有效的方法来比较两个太大而无法放入内存(1M 或更多)的数据集。我将它们都放在 MySQL 中作为表。我试图找出服务器和客户端之间的区别,并在客户端上找到要更新、创建和删除的内容。我可以在之前对数据进行排序或保持排序。

input:
server = [
  {:id => 7, :rev => 1, :uuid => 111},
  {:id => 8, :rev => 3, :uuid => 222},
  {:id => 9, :rev => 1, :uuid => 333},
  ]

client = [
  {:id => 8, :rev => 2, :uuid => 222},
  {:id => 9, :rev => 1, :uuid => 333},
  {:id => 6, :rev => 1, :uuid => 444},
  ]

expected output:
create: [{:id => 7, :rev => 1, :uuid => 111}]
update: [{:id => 8, :rev => 3, :uuid => 222}]
delete: [{:id => 6, :rev => 1, :uuid => 444}]

我正在寻找一种方法来划分这个差异问题并将其分布在几个工人/节点上。我可以使用不同的数据存储,如果它可以在数据存储上而不是在 ruby​​ 或 c 中完成,那就太好了。建议?

4

3 回答 3

0

如果您真的想分发工作,您应该使用 MapReduce 框架,例如 Hadoop。

这个想法是你map在客户端和服务器上,将每条记录发送到一个键,它是它的键,id一个指示它来自哪里的值,以及它具有的值。

然后,reduce遗嘱只需要处理单个 的记录id,并且它具有简单的逻辑。

该框架负责分配工作、如何处理机器故障等。

也就是说,如果您每个只有 100 万条记录,则只需在本地将其整理好,按顺序吸出整个远程集,然后并行遍历它们。它可能会足够快地执行,并且您在设置/使用远程框架时会省去很多麻烦。

于 2013-08-08T22:01:46.693 回答
0

如果您不想使用 SQL 以外的编程语言,请查看以下 MySQL 功能:

于 2013-08-08T20:39:11.333 回答
0

您可以创建数据密钥的散列并相应地分配工作。前任。假设一个简单的散列函数是“id mod 2”。因此,所有偶数 id 由一台机器处理,所有奇数 id 由第二台机器处理。

在每台单独的机器上,数据需要按排序顺序排列。

于 2013-08-08T16:30:26.710 回答