【问题标题】:How to partition RDF triples in Java based on subject如何根据主题在 Java 中对 RDF 三元组进行分区
【发布时间】:2016-02-18 18:43:09
【问题描述】:

为了按主题划分 RDF 三元组,我使用主题的 String.hashCode() 并将三元组放在相应的分区中。目标是能够处理内存中的分区文件(可能无法处理大文件)。

现在为了限制分区数量,我执行以下操作。假设我们想要有 10 个分区,在一个大的 RDF 文件中:

    String subject; 
    partitionFileName = subject.hashCode / (Integer.MAX_VALUE/10)

因此,所有具有相同主题的三元组都将在一个分区中,我们总共将有 10 个分区。

现在的问题是,当三元组具有不同的分布时,可能会导致不希望出现的非常大或非常小的分区。

有人有什么建议吗?

提前谢谢你。

【问题讨论】:

标签: java hash rdf hashcode triples


【解决方案1】:

算法:

  • 为每个主题创建一个分区(这可以在 RDF 处理过程中即时完成)
  • 对于每一个三元组,根据主题将其分配给一个分区,并记住主题-分区映射
  • 当分区数 > 10 时,合并两个最小的分区并更新地图

优点:

  • 确保具有相同主题的所有三元组都在同一个分区中
  • 只要您的数据不严重不平衡,就保持平衡
  • 如果您不想使用哈希码,则不必使用

缺点:

  • 额外的处理时间,虽然不是一个繁重的数量;这是 O(n * m),其中 n 是三元组的数量,m 是不同主题的数量
  • 如果您的数据非常不均匀,则使用不同的分区大小,但这是不可避免的,因为您希望所有具有相同主题的三元组都位于同一分区中
  • 您必须维护映射以执行查找,但这最终是微不足道的,并且是一个恒定的时间操作

如果您不关心在单个分区中保留相同主题的三元组,那么只需创建十个存储桶并循环填充它们。 O(n) 并且尽可能平衡。

【讨论】:

  • 优秀。反之,如果你不关心分区的数量,但想保证每个分区的大小不大于X,则一次填充一个桶,当前一个桶满时创建下一个桶。
【解决方案2】:

您可以简单地使用模来分割分区:

subject.hashCode() % 10

将在十个分区上或多或少地平均分配。

【讨论】:

  • 是什么让您认为主题的集合会产生近似均匀分布的哈希码?这里不能保证使用基本的 String 实现,因为分布是数据驱动的。三元组的主题可能有一些非常常见的主题和一些罕见的主题,即使哈希函数在一组值中是均匀的,也会产生不均匀的分布。
  • @EsotericScreenName 感谢您的评论。你能想到任何其他的解决方案吗?我认为没有任何解决方案。
  • @javadeveloper 问题的核心是您按主题进行分区 - 您实际上不知道这样的分区是否会产生合理的“传播”(可能有一个主题有 10,000 个三元组, 和一个只有 3 个数据的主题)。如果您的目标是生成大小合理的文件分区,则根本不需要查看主题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-30
相关资源
最近更新 更多