读取文件速度

parent 36968d43
...@@ -4,6 +4,7 @@ import com.aps.common.util.redis.RedisUtils; ...@@ -4,6 +4,7 @@ import com.aps.common.util.redis.RedisUtils;
import com.aps.entity.Algorithm.Chromosome; import com.aps.entity.Algorithm.Chromosome;
import com.aps.entity.Schedule.SceneChromsome; import com.aps.entity.Schedule.SceneChromsome;
import com.aps.entity.Schedule.SceneDetail; import com.aps.entity.Schedule.SceneDetail;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
...@@ -17,11 +18,7 @@ import java.util.List; ...@@ -17,11 +18,7 @@ import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
* SceneService.java * 场景结果文件读写服务
*
* @author jdt
* @description 场景保存修改
* @since 2025-12-01
*/ */
@Service @Service
public class SceneService { public class SceneService {
...@@ -31,20 +28,15 @@ public class SceneService { ...@@ -31,20 +28,15 @@ public class SceneService {
@Autowired @Autowired
private RedisUtils redisUtils; private RedisUtils redisUtils;
// 统一配置 ObjectMapper
private ObjectMapper createObjectMapper() { private ObjectMapper createObjectMapper() {
ObjectMapper objectMapper = new ObjectMapper(); ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(new JavaTimeModule()); objectMapper.registerModule(new JavaTimeModule());
objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
objectMapper.enable(SerializationFeature.INDENT_OUTPUT); objectMapper.disable(SerializationFeature.INDENT_OUTPUT);
// 忽略未知属性,防止反序列化时出错 objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
objectMapper.configure(com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
return objectMapper; return objectMapper;
} }
/**
* 获取文件存储目录
*/
private File getResultDirectory() { private File getResultDirectory() {
File resultDir = new File("result"); File resultDir = new File("result");
if (!resultDir.exists()) { if (!resultDir.exists()) {
...@@ -57,23 +49,20 @@ public class SceneService { ...@@ -57,23 +49,20 @@ public class SceneService {
return resultDir; return resultDir;
} }
/**
* 获取文件路径
*/
private File getChromosomeFile(String sceneId) { private File getChromosomeFile(String sceneId) {
File resultDir = getResultDirectory(); File resultDir = getResultDirectory();
String fileName = "chromosome_result_" + sceneId + ".json"; String fileName = "chromosome_result_" + sceneId + ".json";
return new File(resultDir, fileName); return new File(resultDir, fileName);
} }
private File getChromosomeFile(String sceneId,String ver) { private File getChromosomeFile(String sceneId, String version) {
File resultDir = getResultDirectory(); File resultDir = getResultDirectory();
String fileName = "chromosome_result_" + sceneId +"_"+ver+"_.json"; String fileName = "chromosome_result_" + sceneId + "_" + version + "_.json";
return new File(resultDir, fileName); return new File(resultDir, fileName);
} }
/** /**
* 从文件中读取Chromosome对象 * 从文件中读取 Chromosome 对象,并拆分文件读取与反序列化耗时。
*/ */
public Chromosome loadChromosomeFromFile(String sceneId) { public Chromosome loadChromosomeFromFile(String sceneId) {
if (sceneId == null || sceneId.trim().isEmpty()) { if (sceneId == null || sceneId.trim().isEmpty()) {
...@@ -82,41 +71,51 @@ public class SceneService { ...@@ -82,41 +71,51 @@ public class SceneService {
} }
try { try {
long totalStart = System.nanoTime();
ObjectMapper objectMapper = createObjectMapper(); ObjectMapper objectMapper = createObjectMapper();
SceneChromsome sceneChromsome=(SceneChromsome)redisUtils.get("SceneId."+sceneId); SceneChromsome sceneChromsome = (SceneChromsome) redisUtils.get("SceneId." + sceneId);
File file; File file;
if(sceneChromsome==null) { if (sceneChromsome == null) {
file = getChromosomeFile(sceneId); file = getChromosomeFile(sceneId);
}else { } else {
file = getChromosomeFile(sceneId,sceneChromsome.getVersion().toString()); file = getChromosomeFile(sceneId, sceneChromsome.getVersion().toString());
} }
if (!file.exists()) { if (!file.exists()) {
logger.warn("染色体文件不存在: {}", file.getAbsolutePath()); logger.warn("染色体文件不存在: {}", file.getAbsolutePath());
return null; return null;
} }
if (file.length() == 0) { long fileSize = file.length();
if (fileSize == 0) {
logger.warn("染色体文件为空: {}", file.getAbsolutePath()); logger.warn("染色体文件为空: {}", file.getAbsolutePath());
return null; return null;
} }
logger.info("正在从文件加载染色体: {}", file.getAbsolutePath()); logger.info("正在从文件加载染色体: {}, sceneId={}, fileSize={} bytes",
Chromosome chromosome = objectMapper.readValue(file, Chromosome.class); file.getAbsolutePath(), sceneId, fileSize);
logger.info("染色体加载成功,场景ID: {}", sceneId);
return chromosome; long fileReadStart = System.nanoTime();
byte[] fileBytes = Files.readAllBytes(file.toPath());
long fileReadMs = (System.nanoTime() - fileReadStart) / 1_000_000;
long deserializeStart = System.nanoTime();
Chromosome chromosome = objectMapper.readValue(fileBytes, Chromosome.class);
long deserializeMs = (System.nanoTime() - deserializeStart) / 1_000_000;
long totalMs = (System.nanoTime() - totalStart) / 1_000_000;
logger.info("染色体加载成功,场景ID: {}, fileSize={} bytes, fileRead={} ms, deserialize={} ms, total={} ms",
sceneId, fileSize, fileReadMs, deserializeMs, totalMs);
return chromosome;
} catch (Exception e) { } catch (Exception e) {
// 正确的错误日志写法
logger.error("加载染色体文件失败,场景ID: " + sceneId, e); logger.error("加载染色体文件失败,场景ID: " + sceneId, e);
throw new RuntimeException("加载染色体文件失败: " + e.getMessage(), e); throw new RuntimeException("加载染色体文件失败: " + e.getMessage(), e);
} }
} }
/** /**
* 将染色体结果保存到JSON文件 * 将染色体结果保存到 JSON 文件
*/ */
public boolean saveChromosomeToFile(Chromosome chromosome, String sceneId) { public boolean saveChromosomeToFile(Chromosome chromosome, String sceneId) {
if (chromosome == null) { if (chromosome == null) {
...@@ -132,45 +131,35 @@ public class SceneService { ...@@ -132,45 +131,35 @@ public class SceneService {
try { try {
ObjectMapper objectMapper = createObjectMapper(); ObjectMapper objectMapper = createObjectMapper();
SceneChromsome sceneChromsome=(SceneChromsome)redisUtils.get("SceneId."+sceneId); SceneChromsome sceneChromsome = (SceneChromsome) redisUtils.get("SceneId." + sceneId);
if(sceneChromsome==null) if (sceneChromsome == null) {
{ sceneChromsome = new SceneChromsome();
sceneChromsome=new SceneChromsome();
sceneChromsome.setSceneID(sceneId); sceneChromsome.setSceneID(sceneId);
sceneChromsome.setVersion(1); sceneChromsome.setVersion(1);
}else { } else {
Integer v = sceneChromsome.getVersion(); Integer currentVersion = sceneChromsome.getVersion();
// 回退后编辑,会清除后续版本,重新生成 List<SceneDetail> nextVersions = sceneChromsome.getSceneDetails().stream()
List<SceneDetail> nexts= sceneChromsome.getSceneDetails().stream() .filter(detail -> detail.getVersion() > currentVersion)
.filter(t -> t.getVersion() > v)
.collect(Collectors.toList()); .collect(Collectors.toList());
if(nexts!=null&&nexts.size()>0) if (!nextVersions.isEmpty()) {
{ for (SceneDetail detail : nextVersions) {
for (SceneDetail d:nexts) { File nextFile = getChromosomeFile(sceneId, detail.getVersion().toString());
File file1 = getChromosomeFile(sceneId,d.getVersion().toString()); Files.deleteIfExists(nextFile.toPath());
Files.deleteIfExists(file1.toPath());
} }
} }
sceneChromsome.getSceneDetails().removeIf(t -> t.getVersion() > v); sceneChromsome.getSceneDetails().removeIf(detail -> detail.getVersion() > currentVersion);
sceneChromsome.setVersion(sceneChromsome.getVersion() + 1); sceneChromsome.setVersion(sceneChromsome.getVersion() + 1);
} }
SceneDetail sceneDetail=new SceneDetail(); SceneDetail sceneDetail = new SceneDetail();
sceneDetail.setVersion(sceneChromsome.getVersion()); sceneDetail.setVersion(sceneChromsome.getVersion());
sceneChromsome.getSceneDetails().add(sceneDetail); sceneChromsome.getSceneDetails().add(sceneDetail);
redisUtils.set("SceneId." + sceneId, sceneChromsome);
File file = getChromosomeFile(sceneId, sceneChromsome.getVersion().toString());
redisUtils.set("SceneId."+sceneId,sceneChromsome);
File file = getChromosomeFile(sceneId,sceneChromsome.getVersion().toString());
File tempFile = new File(file.getParentFile(), file.getName() + ".tmp"); File tempFile = new File(file.getParentFile(), file.getName() + ".tmp");
chromosome.setVersion(sceneChromsome.getVersion()); chromosome.setVersion(sceneChromsome.getVersion());
objectMapper.writeValue(tempFile, chromosome); objectMapper.writeValue(tempFile, chromosome);
if (tempFile.length() == 0) { if (tempFile.length() == 0) {
...@@ -179,7 +168,6 @@ public class SceneService { ...@@ -179,7 +168,6 @@ public class SceneService {
return false; return false;
} }
// 验证文件内容
try { try {
Chromosome verifyChromosome = objectMapper.readValue(tempFile, Chromosome.class); Chromosome verifyChromosome = objectMapper.readValue(tempFile, Chromosome.class);
if (verifyChromosome == null) { if (verifyChromosome == null) {
...@@ -191,7 +179,6 @@ public class SceneService { ...@@ -191,7 +179,6 @@ public class SceneService {
return false; return false;
} }
// 替换原文件
if (file.exists()) { if (file.exists()) {
Files.deleteIfExists(file.toPath()); Files.deleteIfExists(file.toPath());
} }
...@@ -199,78 +186,56 @@ public class SceneService { ...@@ -199,78 +186,56 @@ public class SceneService {
logger.info("染色体保存成功,场景ID: {}, 文件: {}", sceneId, file.getAbsolutePath()); logger.info("染色体保存成功,场景ID: {}, 文件: {}", sceneId, file.getAbsolutePath());
return true; return true;
} catch (Exception e) { } catch (Exception e) {
logger.error("保存染色体文件失败,场景ID: " + sceneId, e); logger.error("保存染色体文件失败,场景ID: " + sceneId, e);
return false; return false;
} }
} }
public SceneChromsome getSceneChromsome(String sceneId) {
SceneChromsome sceneChromsome=(SceneChromsome)redisUtils.get("SceneId."+sceneId);
return sceneChromsome; public SceneChromsome getSceneChromsome(String sceneId) {
return (SceneChromsome) redisUtils.get("SceneId." + sceneId);
} }
public Chromosome moveChromosome(String sceneId,Integer version)
{
SceneChromsome sceneChromsome=(SceneChromsome)redisUtils.get("SceneId."+sceneId);
if(sceneChromsome==null) {
return null;
}else {
int prevVersion = sceneChromsome.getVersion() - 1;
if (prevVersion == 0) {
throw new RuntimeException("无法撤销,当前已是第一个版本");
}
sceneChromsome.setVersion(prevVersion);
redisUtils.set("SceneId."+sceneId,sceneChromsome);
Chromosome chromosome = loadChromosomeFromFile(sceneId);
if (chromosome == null) {
sceneChromsome.setVersion(sceneChromsome.getVersion() + 1);
redisUtils.set("SceneId."+sceneId,sceneChromsome);
throw new RuntimeException("撤销操作失败,未找到上一个版本");
}
return chromosome;
public Chromosome moveChromosome(String sceneId, Integer version) {
SceneChromsome sceneChromsome = (SceneChromsome) redisUtils.get("SceneId." + sceneId);
if (sceneChromsome == null) {
return null;
} }
int previousVersion = sceneChromsome.getVersion() - 1;
if (previousVersion == 0) {
throw new RuntimeException("无法撤销,当前已经是第一个版本");
}
sceneChromsome.setVersion(previousVersion);
redisUtils.set("SceneId." + sceneId, sceneChromsome);
Chromosome chromosome = loadChromosomeFromFile(sceneId);
if (chromosome == null) {
sceneChromsome.setVersion(sceneChromsome.getVersion() + 1);
redisUtils.set("SceneId." + sceneId, sceneChromsome);
throw new RuntimeException("撤销操作失败,未找到上一个版本");
}
return chromosome;
} }
public Chromosome revertVersion(String sceneId, Integer version) {
SceneChromsome sceneChromsome = (SceneChromsome) redisUtils.get("SceneId." + sceneId);
if (sceneChromsome == null) {
return null;
}
public Chromosome revertVersion(String sceneId,Integer version)
{
SceneChromsome sceneChromsome=(SceneChromsome)redisUtils.get("SceneId."+sceneId);
Integer currentVersion = sceneChromsome.getVersion(); Integer currentVersion = sceneChromsome.getVersion();
if(sceneChromsome==null) { sceneChromsome.setVersion(version);
return null; redisUtils.set("SceneId." + sceneId, sceneChromsome);
}else { Chromosome chromosome = loadChromosomeFromFile(sceneId);
if (chromosome == null) {
sceneChromsome.setVersion(version); sceneChromsome.setVersion(currentVersion);
redisUtils.set("SceneId."+sceneId,sceneChromsome); redisUtils.set("SceneId." + sceneId, sceneChromsome);
Chromosome chromosome = loadChromosomeFromFile(sceneId); throw new RuntimeException("恢复版本失败,未找到对应版本");
if (chromosome == null) {
sceneChromsome.setVersion(currentVersion);
redisUtils.set("SceneId."+sceneId,sceneChromsome);
throw new RuntimeException("撤销操作失败,未找到上一版本");
}
return chromosome;
} }
return chromosome;
} }
/** /**
* 检查染色体文件是否存在 * 检查染色体文件是否存在
*/ */
...@@ -278,12 +243,12 @@ public class SceneService { ...@@ -278,12 +243,12 @@ public class SceneService {
if (sceneId == null || sceneId.trim().isEmpty()) { if (sceneId == null || sceneId.trim().isEmpty()) {
return false; return false;
} }
SceneChromsome sceneChromsome=(SceneChromsome)redisUtils.get("SceneId."+sceneId); SceneChromsome sceneChromsome = (SceneChromsome) redisUtils.get("SceneId." + sceneId);
File file; File file;
if(sceneChromsome==null) { if (sceneChromsome == null) {
file = getChromosomeFile(sceneId); file = getChromosomeFile(sceneId);
}else { } else {
file = getChromosomeFile(sceneId,sceneChromsome.getVersion().toString()); file = getChromosomeFile(sceneId, sceneChromsome.getVersion().toString());
} }
return file.exists() && file.length() > 0; return file.exists() && file.length() > 0;
} }
...@@ -293,11 +258,9 @@ public class SceneService { ...@@ -293,11 +258,9 @@ public class SceneService {
*/ */
public boolean deleteChromosomeFile(String sceneId) { public boolean deleteChromosomeFile(String sceneId) {
try { try {
SceneChromsome sceneChromsome = (SceneChromsome) redisUtils.get("SceneId." + sceneId);
SceneChromsome sceneChromsome=(SceneChromsome)redisUtils.get("SceneId."+sceneId);
File file; File file;
if(sceneChromsome==null) { if (sceneChromsome == null) {
file = getChromosomeFile(sceneId); file = getChromosomeFile(sceneId);
if (file.exists()) { if (file.exists()) {
boolean deleted = Files.deleteIfExists(file.toPath()); boolean deleted = Files.deleteIfExists(file.toPath());
...@@ -305,22 +268,20 @@ public class SceneService { ...@@ -305,22 +268,20 @@ public class SceneService {
logger.info("删除染色体文件成功: {}", file.getAbsolutePath()); logger.info("删除染色体文件成功: {}", file.getAbsolutePath());
} }
} }
}else { } else {
for (SceneDetail d:sceneChromsome.getSceneDetails()) { for (SceneDetail detail : sceneChromsome.getSceneDetails()) {
file = getChromosomeFile(sceneId,d.getVersion().toString()); file = getChromosomeFile(sceneId, detail.getVersion().toString());
if (file.exists()) { if (file.exists()) {
boolean deleted = Files.deleteIfExists(file.toPath()); boolean deleted = Files.deleteIfExists(file.toPath());
if (deleted) { if (deleted) {
logger.info("删除染色体文件成功: {}", file.getAbsolutePath()); logger.info("删除染色体文件成功: {}", file.getAbsolutePath());
} }
} }
} }
} }
// 删除Redis中的场景信息 redisUtils.del("SceneId." + sceneId);
redisUtils.del("SceneId."+sceneId); logger.info("删除Redis场景信息成功: {}", "SceneId." + sceneId);
logger.info("删除Redis场景信息成功: {}", "SceneId."+sceneId);
return true; return true;
} catch (Exception e) { } catch (Exception e) {
...@@ -331,8 +292,6 @@ public class SceneService { ...@@ -331,8 +292,6 @@ public class SceneService {
/** /**
* 清理历史版本的排产结果文件,只保留当前版本 * 清理历史版本的排产结果文件,只保留当前版本
* @param sceneId 场景ID
* @return 是否清理成功
*/ */
public boolean cleanupHistoricalVersions(String sceneId) { public boolean cleanupHistoricalVersions(String sceneId) {
try { try {
...@@ -355,12 +314,11 @@ public class SceneService { ...@@ -355,12 +314,11 @@ public class SceneService {
for (SceneDetail detail : sceneDetails) { for (SceneDetail detail : sceneDetails) {
Integer version = detail.getVersion(); Integer version = detail.getVersion();
if (version < currentVersion) { if (version < currentVersion) {
// 删除历史版本的文件
File file = getChromosomeFile(sceneId, version.toString()); File file = getChromosomeFile(sceneId, version.toString());
if (file.exists()) { if (file.exists()) {
boolean deleted = Files.deleteIfExists(file.toPath()); boolean deleted = Files.deleteIfExists(file.toPath());
if (deleted) { if (deleted) {
logger.info("删除历史版本排产结果文件成功: {}版本: {}", file.getAbsolutePath(), version); logger.info("删除历史版本排产结果文件成功: {}, 版本: {}", file.getAbsolutePath(), version);
} }
} }
} }
...@@ -374,8 +332,4 @@ public class SceneService { ...@@ -374,8 +332,4 @@ public class SceneService {
return false; return false;
} }
} }
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment