如何根据主题在 Java 中划分 RDF 三元组
How to partition RDF triples in Java based on subject
为了按主题划分 RDF 三元组,我使用主题的 String.hashCode() 并将三元组放在相应的分区中。目标是能够处理内存中的分区文件(处理大文件可能是不可能的)。
现在为了限制分区数量,我执行以下操作。假设我们想要在一个大的 RDF 文件中有 10 个分区:
String subject;
partitionFileName = subject.hashCode / (Integer.MAX_VALUE/10)
因此所有具有相同主题的三元组将在一个分区中,总共我们将有 10 个分区。
现在的问题是,当三元组有不同的分布时,它会导致非常大或非常小的分区,这是不希望的。
大家有什么建议吗?
提前致谢。
您可以简单地使用取模来分割分区:
subject.hashCode() % 10
将或多或少平均分配给十个分区。
算法:
- 为每个主题创建一个分区(这可以在 RDF 处理期间即时完成)
- 对于每个三元组,根据主题将其分配给一个分区并记住主题-分区映射
- 当分区数 > 10 时,合并两个最小的分区并更新地图
优点:
- 确保具有相同主题的所有三元组都在同一分区中
- 只要您的数据不是非常不平衡,就会保持平衡
- 如果您不想,则不必使用哈希码
缺点:
- 额外的处理时间,虽然不是很繁重;这是 O(n * m),其中 n 是三元组的数量,m 是不同主题的数量
- 如果您的数据非常不均匀,则分区大小不同,但这是不可避免的,因为您希望同一分区中具有相同主题的所有三元组
- 您必须维护映射以执行查找,但这最终是微不足道的,并且是一个恒定时间的操作
如果您不关心将同一主题的三元组保留在单个分区中,则只需创建十个存储桶并循环填充它们。 O(n) 并尽可能平衡。
为了按主题划分 RDF 三元组,我使用主题的 String.hashCode() 并将三元组放在相应的分区中。目标是能够处理内存中的分区文件(处理大文件可能是不可能的)。
现在为了限制分区数量,我执行以下操作。假设我们想要在一个大的 RDF 文件中有 10 个分区:
String subject;
partitionFileName = subject.hashCode / (Integer.MAX_VALUE/10)
因此所有具有相同主题的三元组将在一个分区中,总共我们将有 10 个分区。
现在的问题是,当三元组有不同的分布时,它会导致非常大或非常小的分区,这是不希望的。
大家有什么建议吗?
提前致谢。
您可以简单地使用取模来分割分区:
subject.hashCode() % 10
将或多或少平均分配给十个分区。
算法:
- 为每个主题创建一个分区(这可以在 RDF 处理期间即时完成)
- 对于每个三元组,根据主题将其分配给一个分区并记住主题-分区映射
- 当分区数 > 10 时,合并两个最小的分区并更新地图
优点:
- 确保具有相同主题的所有三元组都在同一分区中
- 只要您的数据不是非常不平衡,就会保持平衡
- 如果您不想,则不必使用哈希码
缺点:
- 额外的处理时间,虽然不是很繁重;这是 O(n * m),其中 n 是三元组的数量,m 是不同主题的数量
- 如果您的数据非常不均匀,则分区大小不同,但这是不可避免的,因为您希望同一分区中具有相同主题的所有三元组
- 您必须维护映射以执行查找,但这最终是微不足道的,并且是一个恒定时间的操作
如果您不关心将同一主题的三元组保留在单个分区中,则只需创建十个存储桶并循环填充它们。 O(n) 并尽可能平衡。