2014-02-10 48 views
0

在使用lucene索引進行批量插入時,給定一大組節點和關係以使節點和關係存儲不能完全適合映射的內存(因此需要lucene索引緩存),應該如何在MMIO和lucene之間劃分內存索引緩存實現最佳性能?閱讀完文檔後,我已經對如何在映射內存模式中劃分內存有所瞭解。我對MMIO和lucene緩存之間的整體內存分配感興趣。由於我正在研究硬件碰巧可用的原型,未來的資源和數據量尚未確定,所以我寧願將答案放在一般條件下(我認爲這也會使答案對其餘部分更有用) Neo4j的社會太),所以這將是很好,如果我能提出這樣的問題:如何在BatchInserterIndex緩存和MMIO之間進行分配?

鑑於

RWN節點和編寫,並且必須在後面的批量插入閱讀RWR關係, 贏得節點和只有寫入的工作關係, G千兆字節的RAM(不包括操作系統所需的)

Lucene索引緩存和MMIO之間的最佳G分區是什麼?

如果需要更多的細節,我可以提供他們爲我的特殊情況。

回答

0

所有這些考慮只導入節點(多)十億關係

相關通常當你查找它取決於你的索引查找的「熱數據集大小」。

默認情況下,這是所有節點,但如果您更好地瞭解自己的域,則可以設計一些分頁,從而生成較小的所需緩存(例如,通過預先對輸入數據進行排序,以便通過開始和結束節點查找屬性),那麼你在節點數據上有一個移動窗口,在這個窗口中每個節點都經常被訪問。

我通常甚至按min(開始,結束)排序。

通常情況下,您會嘗試將大部分RAM用於rel-store和node store的mmio映射。物業商店只能寫入,但其他物品也必須更新。

索引緩存查找只是幕後的HashMap,非常浪費。我發現更好的工作是使用不同的方法,例如,一個多傳一個。

  • 使用字符串數組擺在那裏所有的查閱屬性,排序並使用數組的索引(Arrays.binarySearch)爲節點ID,然後查找僅在該陣列是相當有效率
  • 另一種方式在源數據上使用多遍,因此您已經創建了作爲源的一部分的rels所需的node-id,Xebia的Friso和Kris在他們的hadoop based solution中做了類似的操作。 monotonically increasing parallel id's
+0

謝謝!這清理了很多東西。我已經切換到緩存較少的解決方案,其中我生成我自己的節點ID,並且在加載時從不需要讀取任何內容。節省巨大的時間。 –

相關問題