【问题标题】:Caching Table - Google Guava Table缓存表 - Google Guava Table
【发布时间】:2016-04-25 09:31:23
【问题描述】:

我正在使用 Google Guava Table 来处理 JAVA 应用程序中的表格结构化数据。我的数据对象由表和一个地图组成,它存储每列的数据类型(int、string、decimal ...)。

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 行左右将 chache 到临时文件夹,并在需要时读取数据。

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

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

我遇到了数据处理的大问题。一方面缓存非常耗时,另一方面又很难保证没有数据丢失,而且我还没有找到一个好的第三方 API 来缓存数据。

【问题讨论】:

    标签: java caching guava


    【解决方案1】:

    对于数据,您可以缓存单个值或完整的行。 要缓存单个值,请构造行和列的单个复合键对象。

    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 这样的缓存,它支持将数据写入磁盘,如果它不适合堆。

    你应该采取什么方法取决于:

    • 生成一行或一个值的成本是多少?高成本 -> 缓存整行
    • 只有少数列被频繁访问 -> 只缓存列值

    为了使缓存有用,它要求您可以(重新)为特定行生成丢失的数据,并且您具有更频繁地请求行中的某些行或值的访问模式。如果您只能生成整个数据,或者只能在一次扫描中访问完整数据,那么小型数据库是一种有效的替代方案。寻找类似mapdbleveldb 的内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多