2016-04-25 95 views
0

我正在使用Google Guava表來處理JAVA應用程序中的表結構化數據。我的數據對象由Table和Map組成,它存儲每列的數據類型(int,string,decimal ...)。緩存表 - Google Guava表

public class DataTable { 

    private Table<Integer, String, Object> data; 
    private Map<String, Integer> types; 

    private static int maxObjectSize; 
    private static int rowSize; 

    private DiskCache dc; 

    public DataTable(){ 

    //Getter and Setter 

該對象可能會變得非常大並且佔用內存(高達10,000,000行和16 GB內存)。所以我的想法是每50,000行左右換一個臨時文件夾,並在需要時讀取數據。

public void putRow(int row, String column, Object value){ 
    data.put(row, column, value); 
    rowSize = data.rowKeySet().size(); 

    if(rowSize == maxObjectSize){ 
     writeCache(); 
    } 
} 

我一直在討論數據的大問題。一方面,緩存非常耗時,另一方面很難確保沒有數據丟失,並且我還沒有找到一個好的第三方API來存儲數據。

回答

0

對於您可以緩存單個值或完整行的數據。 要緩存單個值,請構建行和列的單個複合關鍵對象。

Cache<CompoundKey, Object> cache = ...; 
Object getValue(int row, String column) { 
    return cache.get(new CompoundKey(row, column)); 
} 

或者,您可以通過將映射放入緩存中來緩存整行。

Cache<Integer, Map<String, Object> cache = ...; 
Map<String, Object> getRow(int row) { 
    return cache.get(row); 
} 

如果EHCache不適合堆,您可以使用EHCache之類的緩存,該緩存支持將數據寫入磁盤。

你應該採取什麼方法取決於:

  • 如何昂貴是它生成一個行或價值?高性價比 - >緩存整行
  • 只有少數列非常頻繁訪問 - >緩存僅列值

對於高速緩存是有用的,它要求你可以(重新)產生缺失特定行的數據,並且您有訪問模式,更頻繁地請求某行中的某些行或值。如果只能生成整個數據,或者只能在一次掃描中訪問完整的數據,那麼一個小型數據庫是一個有效的選擇。尋找類似mapdbleveldb的東西。