为了按主题对 RDF 三元组进行分区,我使用主题的 String.hashCode() 并将三元组放入相应的分区中。目标是能够处理内存中的分区文件(处理大文件可能无法)。
现在为了限制数量的分区,我执行以下操作。假设我们想要在一个大的 RDF 文件中拥有 10 个分区:
String subject;
partitionFileName = subject.hashCode / (Integer.MAX_VALUE/10)
因此,具有相同主题的所有三元组将位于一个分区中,总共我们将有 10 个分区。
现在的问题是,当三元组具有不同的分布时,可能会导致非常大或非常小的分区,这是不希望的。
有人有什么建议吗?
提前谢谢您。
最佳答案
算法:
- 为每个主题创建一个分区(这可以在 RDF 处理期间即时完成)
- 对于每个三元组,根据主题将其分配给分区并记住主题-分区映射
- 当分区数 > 10 时,合并两个最小的分区并更新 map
优点:
- 确保具有相同主题的所有三元组位于同一分区中
- 只要您的数据不是非常不平衡,就可以保持平衡
- 如果您不想,则不必使用哈希码
缺点:
- 额外的处理时间,尽管数量并不繁重;这是 O(n * m),其中 n 是三元组的数量,m 是不同主题的数量
- 如果您的数据非常不均匀,则分区大小不同,但这是不可避免的,因为您希望具有相同主题的所有三元组位于同一分区中
- 您必须维护映射才能执行查找,但这最终是微不足道的,而且是一个恒定时间的操作
如果您不关心在单个分区中保留相同主题的三元组,则只需创建十个存储桶并循环填充它们即可。 O(n) 并尽可能平衡。
关于java - 如何在Java中根据主题划分RDF三元组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35489838/