读取文件速度

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