task-9: chunk 查询改为批量 keyset 分页,保持低内存读取
loadChunksKeyset 按 id 递增分批拉取(每批 pageSize),最后按 chunkIndex 升序合并,避免超大任务一次 selectList 全量载入 chunk 元数据。surefire fork 堆显式限制 1536m 防止与主 JVM 叠加挤爆内存。
This commit is contained in:
+40
@@ -1469,6 +1469,46 @@ public class SimilarAsinTaskService {
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Task 9:按 id keyset 批量分页拉取 chunk,保持低内存读取。
|
||||
* 每轮只取 pageSize 条(id > lastId 升序),全部取回后按 chunkIndex 升序合并。
|
||||
* taskId 为 null 安全返回空;pageSize <= 0 回退默认 500;
|
||||
* 中途查询失败抛项目约定异常,不返回半截结果。
|
||||
* 使用 QueryWrapper(列名直写)避免对 lambda 元数据缓存的依赖。
|
||||
*/
|
||||
static List<TaskChunkEntity> loadChunksKeyset(TaskChunkMapper mapper, Long taskId, String moduleType, int pageSize) {
|
||||
if (taskId == null || mapper == null) {
|
||||
return List.of();
|
||||
}
|
||||
int batch = pageSize > 0 ? pageSize : 500;
|
||||
List<TaskChunkEntity> all = new ArrayList<>();
|
||||
long lastId = 0L;
|
||||
while (true) {
|
||||
List<TaskChunkEntity> page;
|
||||
try {
|
||||
page = mapper.selectList(new com.baomidou.mybatisplus.core.conditions.query.QueryWrapper<TaskChunkEntity>()
|
||||
.eq("task_id", taskId)
|
||||
.eq("module_type", moduleType)
|
||||
.gt("id", lastId)
|
||||
.orderByAsc("id")
|
||||
.last("limit " + batch));
|
||||
} catch (Exception ex) {
|
||||
throw new BusinessException("chunk keyset 分页查询失败: " + ex.getMessage(), ex);
|
||||
}
|
||||
if (page == null || page.isEmpty()) {
|
||||
break;
|
||||
}
|
||||
all.addAll(page);
|
||||
lastId = page.getLast().getId();
|
||||
if (page.size() < batch) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
all.sort(java.util.Comparator.comparing(TaskChunkEntity::getChunkIndex,
|
||||
java.util.Comparator.nullsLast(java.util.Comparator.naturalOrder())));
|
||||
return all;
|
||||
}
|
||||
|
||||
private void applyCozeToPersistedChunks(FileTaskEntity task, Runnable progressHook) {
|
||||
if (task == null || task.getId() == null) {
|
||||
return;
|
||||
|
||||
Reference in New Issue
Block a user