首页 > 解决方案 > 将 Amazon DynamoDB ItemCollection 拆分为小块的最快方法

问题描述

我需要构建一个 lambda 函数,从 DynamoDB 拉回数千个项目并在 Api Gateway 超时(29 秒)之前处理它们。我认为最好的方法是将集合分成更小的块并将它们分布在多个线程中以并行处理。

问题是,按照我目前尝试的方式进行操作需要大约 25 秒来拆分集合。有没有更好的方法来解决这个问题以便更快地处理?

代码:

public static List<List<Item>> partitionList(ItemCollection<QueryOutcome> items) {
    final int partitionSize = 20;
    List<List<Item>> partitioned = new LinkedList<List<Item>>();
    List<Item> itemList = new ArrayList<Item>();
    for(Item item : items) {
        itemList.add(item);
    }

    for (int i = 0; i < itemList.size(); i += partitionSize) {
        partitioned.add(itemList.subList(i, Math.min(i + partitionSize, itemList.size())));
    }
    return partitioned;
}

标签: javamultithreadingamazon-dynamodbitemcollection

解决方案


我的 Java 有点生疏,所以请耐心等待细节,但看起来你在这里做了很多额外的工作。

public static List<List<Item>> partitionList(ItemCollection<QueryOutcome> items) {
    final int partitionSize = 20;
    List<List<Item>> partitioned = new LinkedList<List<Item>>();
    List<Item> itemList = new ArrayList<Item>();
    for(Item item : items) {
        itemList.add(item);
        if (itemList.size() == partitionSize) {
            partitioned.add(itemList);
            itemList = new ArrayList<Item>();
        }
    }

    if (itemList.size() != 0) {
        partitioned.add(itemList);
    }

    return partitioned;
}

我很好奇您是如何在此处填充初始列表的,因为这可能是进行这项工作的真正地方。

此外,对于此类工作,您可能应该考虑一些更异步的东西。


推荐阅读