2016-04-25 55 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的东西。