2016-02-18 59 views
0

對於按主題劃分RDF三元組,我使用主題的String.hashCode()並將三元組放在相應的分區中。目標是能夠處理內存中的分區文件(處理大文件可能不可行)。如何根據主題在Java中對RDF三元組進行分區

現在爲了有有限的分區數量,我做了以下工作。假設我們希望有10個分區,走出了一條大RDF文件:

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

因此所有使用相同的科目三元將在一個分區和整體,我們將有10個分區。

現在的問題是,當三元組有不同的分佈時,它可能會導致非常大或非常小的分區,這是不希望的。

有沒有人有任何建議?

預先感謝您。

+0

'subject.hashCode()%10'? – Kenney

+0

Esoteric的答案很好,但是這裏有一個很好的解讀:https:// github。com/gholt/ring/blob/master/BASIC_HASH_RING.md – Michael

回答

3

算法:

  • 創建每個受試者的分區(這可以在運行RDF處理過程中完成)
  • 對於每個三聯,它根據本主題分配給一個分區並且memoize的受試者-partition映射
  • 雖然分區數量> 10,合併兩個分區最小和更新地圖

優點:

  • 確保同一主題的所有三元組是在同一個分區
  • 只要平衡作爲你的數據不是非常不平衡
  • 您不必使用的哈希碼,如果你不想

缺點:

  • 額外的處理時間,儘管不是一項繁重的量;這是O(n * m),其中n是三元組的數量,m是不同主題的數量
  • 如果數據極不平均,則分散的分散大小不同,但這是不可避免的,因爲您希望所有三元組具有相同的主題在同一個分區
  • 你必須保持以針對查找的映射,但這最終是容易做到和恆定時間操作

如果你不關心保持內的同一學科三倍單個分區,然後創建10個桶並填充它們。 O(n)並儘可能平衡。

+2

優秀。相反,如果您不關心分區數量,但希望確保每個分區的大小不大於X,則一次填充一個存儲桶,並在前一個存滿時創建下一個存儲桶。 –

0

您可以簡單地使用模分割分區:

subject.hashCode() % 10 

將分佈在10個分區拆分或多或少均勻。

+2

是什麼讓你認爲主題集合會產生大致均勻的散列碼分佈?使用基本字符串實現無法保證,因爲分發是數據驅動的。三元組的主題可能有一些非常常見的和一些罕見的,即使散列函數在整個值集合上均勻分佈,也會產生不均勻的分佈。 –

+0

@EsotericScreenName感謝您的評論。你能想到其他解決方案嗎?我不認爲有任何解決方案。 –

+2

@javadeveloper @javadeveloper問題的核心是你按主題進行分區 - 你實際上不知道這樣的分區是否會產生合理的「傳播」(可能有一個主題有10,000個三元組,而一個主題只有3個在你的數據中)。如果你的目標是製作一個大小合理的文件分區,你根本不需要看這個主題。 –

相關問題