4

我需要批量加载表中的所有实体。(对于高速按需图遍历算法,它们需要在内存中而不是按需加载。)

我需要将其并行化以提高加载速度。所以,我想在并行线程中运行多个查询,每个查询大约拉。来自数据库的 800 个实体。

QuerySplitter用于此目的,但我们在灵活环境中运行,因此使用的是 Appengine SDK 而不是客户端库。

已经提到了 MapReduce,但这并不是针对简单的数据加载到内存中。Memcache 有点相关,但对于高速访问,我需要在我自己的应用程序的 JVM 的 RAM 中的密集网络中的所有这些对象。

MultiQueryBuilder可能会这样做。它在并行运行部分查询时提供并行性。

无论使用这三种方法中的哪一种或其他方法,最难的部分是定义过滤器或其他形式的拆分,将表(种类)粗略地划分为大约 800 个实体的块?我会创建说“对象 1 到 800”、“801 到 1600,...”的过滤器,但我知道这是不切实际的。那么,如何做到这一点呢?

4

1 回答 1

1

我通过将实体划分为随机组解决了类似的问题。

我为每个数据存储实体添加了一个浮点属性,并在每次保存实体时为其分配一个介于 0 和 1 之间的随机数。然后,当启动N线程对各种数据存储实体进行工作时,我让每个线程处理1/N实体的查询。例如,线程 0 将处理其随机属性设置在0和之间的所有实体1/N1/N线程 2 将处理所有在和之间具有随机属性的实体2/N,等等。

这样做的缺点是它不是完全确定的,您需要向数据存储实体添加新属性。好处是它可以轻松扩展到数百万个实体和线程,并且您通常可以在线程之间获得均匀的工作分配。

于 2016-05-25T05:00:23.363 回答