Самый быстрый способ разделить Amazon DynamoDB ItemCollection на маленькие кусочки - PullRequest
0 голосов
/ 04 февраля 2020

Мне нужно создать лямбда-функцию, которая извлекает несколько тысяч элементов из DynamoDB и обрабатывает их до истечения времени ожидания Api Gateway (29 секунд). Я подумал, что лучший способ сделать это - разбить коллекцию на более мелкие куски и распределить их по нескольким потокам для параллельной обработки.

Проблема в том, что для того, чтобы сделать это так, как я сейчас пытаюсь, нужно ~ 25 секунд, чтобы разделить коллекцию. Есть ли лучший способ go об этом, чтобы обрабатывать намного быстрее?

Код:

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;
}

1 Ответ

1 голос
/ 04 февраля 2020

Мой 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;
}

Мне было бы интересно как вы заполняете начальный список здесь, поскольку это может быть реальное место для выполнения этой работы.

Кроме того, вам, вероятно, следует рассмотреть что-то более асинхронное для этого типа работы.

...