java - 将 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;
}
解决方案
我的 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;
}
我很好奇您是如何在此处填充初始列表的,因为这可能是进行这项工作的真正地方。
此外,对于此类工作,您可能应该考虑一些更异步的东西。
推荐阅读
- jquery - 如何在数组中动态传递列值并通过数组索引设置值
- java - ChromeDriver Selenium 出现“java.lang.module.InvalidModuleDescriptorException:提供程序类 org.apache.bsf.BSFManager 不在模块中”错误
- javascript - 文本未定义 - JavaScript
- flutter - 参数类型“GeneratedIntColumn”不能分配给参数类型“int”:Moor-Flutter
- javascript - 通过索引而不是它们的名称获取 json 键和值
- powershell - 带有参数的 PowerShell 脚本,用于 Google Cloud Platform 上的 Windows VM 实例
- java - 深度优先搜索(堆栈还是递归?)
- mysql - 将持续时间添加到日期后,Django MySQL过滤日期记录
- r - 长到宽格式 R
- ios - 为什么不调用 searchBarTextDidEndEditing?