2012-10-03 95 views
6

我目前正在開發一個Java項目,我必須在一個非常大的數據集上執行幾個信息檢索和分類任務。一個小集合將有10K文件。從每個文件大約100個150維向量的雙打。因此,大約有150個雙打或1M雙打的1M矢量。存儲後,我需要回憶所有這些或其中的一部分,並執行聚類(例如KMEANS)。實際收藏有更多的文件(我目前正在處理200K文件)。使用Java存儲和檢索大型數據集的最佳方法

當然,我已經多次處理OutOfMemoryError,並且我最後一次解決問題的方法是存儲10個大小超過5GB的XML文件。這些文件必須是10,因爲DOM Writer的內存已滿。對於閱讀,我使用了SAX Parser,它沒有將它們加載到內存中。另外,在任何類型的文本中存儲一個double都會增加他的實際大小,並增加解析和轉換的計算成本。最後,聚類算法通常是迭代的,所以它們會一次又一次地需要相同的數據。我的方法沒有緩存任何東西,它只是從磁盤讀取很多次。

我現在正在尋找一種以二進制格式(數據庫,原始二進制文件等)以及讀取它們的有效方式存儲任意數量數據的更緊湊方法。有沒有人有任何想法提出?

回答

4

嵌入式數據庫或鍵值存儲。有很多,例如JDBM3。多麼奇怪的想法存儲在XML格式?您可以使用標準序列化技術簡單地將數組轉儲到文件上。

+1

JDBM3已經升級到JDBM4,更好地瞭解爲[創建mapdb(http://www.mapdb.org/)。 –

0

不要爲此使用Derby。 500K以上的條目存儲是非常緩慢的,並使用了太多的內存

1

我不是很確定你的情況,但對於我們的「大數據處理」的需要,我們使用的NoSQL數據庫和它的工作相當精細。

+0

我將擴展這個答案與一般的大數據的方法。看Hadoop的處理非常大的文件和NoSQL數據庫(每@ jakub.petr)來保存數據 –

0

In-Memory Datagrids可以解決您的問題。有幾種可用的開源解決方案(Hazelcast,Infinispan)。

我只用hazelcast工作尚未 - 所以不能告訴你別人任何東西。

Hazelcast將數據分佈在多個節點上。查詢也分佈在集羣中的所有節點上。

相關問題