新增 强制清理文件缓存目录办法

This commit is contained in:
小肥羊 2026-02-26 15:01:12 +08:00
parent d49550807b
commit 4361e7fa0f
9 changed files with 116 additions and 18 deletions

View File

@ -19,6 +19,7 @@ namespace Learn.VideoAnalysis.API.Expand
Console.WriteLine($"{DateTime.Now}=>初始化 Coravel"); Console.WriteLine($"{DateTime.Now}=>初始化 Coravel");
service.AddScheduler(); service.AddScheduler();
service.AddTransient<TaskFileClearJob>(); service.AddTransient<TaskFileClearJob>();
service.AddTransient<ClearAllCacheJob>();
service.AddTransient<NodePackageJob>(); service.AddTransient<NodePackageJob>();
} }

View File

@ -1,4 +1,4 @@
using Coravel; using Coravel;
using Coravel.Scheduling.Schedule; using Coravel.Scheduling.Schedule;
using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
@ -21,6 +21,7 @@ namespace Learn.VideoAnalysis.Expand
#if !DEBUG #if !DEBUG
service.AddTransient<TaskFileClearJob>(); service.AddTransient<TaskFileClearJob>();
#endif #endif
service.AddTransient<ClearAllCacheJob>();
service.AddTransient<NodePackageJob>(); service.AddTransient<NodePackageJob>();
} }
public static void UseCoravelExpand(this IApplicationBuilder provider) public static void UseCoravelExpand(this IApplicationBuilder provider)
@ -28,8 +29,10 @@ namespace Learn.VideoAnalysis.Expand
provider.ApplicationServices.UseScheduler(scheduler => provider.ApplicationServices.UseScheduler(scheduler =>
{ {
//任务缓存清理 //任务缓存清理
scheduler.Schedule<TaskFileClearJob>().HourlyAt(10); // scheduler.Schedule<TaskFileClearJob>().HourlyAt(10);
//scheduler.Schedule<TaskFileClearJob>().DailyAt(1,0); //强制清理所有缓存内容
//scheduler.Schedule<ClearAllCacheJob>().Hourly();
scheduler.Schedule<ClearAllCacheJob>().EverySeconds(40);
}); });
} }
} }

View File

@ -1,4 +1,4 @@
using Newtonsoft.Json; using Newtonsoft.Json;
using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;

View File

@ -1,4 +1,4 @@
using VideoAnalysisCore.Common; using VideoAnalysisCore.Common;
using System.Text.Json; using System.Text.Json;
using VideoAnalysisCore.Model; using VideoAnalysisCore.Model;
using System.Text; using System.Text;

View File

@ -1,4 +1,4 @@
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using SherpaOnnx; using SherpaOnnx;
using SqlSugar; using SqlSugar;
@ -49,7 +49,7 @@ namespace VideoAnalysisCore.AICore.SherpaOnnx
/// </summary> /// </summary>
public class SherpaVad public class SherpaVad
{ {
static VadModelConfig VADModelConfig = default!; private VadModelConfig VADModelConfig;
private readonly RedisManager redisManager; private readonly RedisManager redisManager;
private int WindowSize = 512; private int WindowSize = 512;
@ -137,6 +137,7 @@ namespace VideoAnalysisCore.AICore.SherpaOnnx
// 使用 Span 操作原始数据 // 使用 Span 操作原始数据
ReadOnlySpan<float> allSamples = reader.Samples.AsSpan(); ReadOnlySpan<float> allSamples = reader.Samples.AsSpan();
int numSamples = allSamples.Length; int numSamples = allSamples.Length;
VADModelConfig.SampleRate = reader.SampleRate;
int sampleRate = VADModelConfig.SampleRate; int sampleRate = VADModelConfig.SampleRate;
int numIter = numSamples / WindowSize; int numIter = numSamples / WindowSize;
var totalSecond = numSamples / (float)sampleRate; var totalSecond = numSamples / (float)sampleRate;

View File

@ -165,8 +165,6 @@ namespace VideoAnalysisCore.Common
await redisManager.AddTaskLog(taskId, $"删除缓存文件 {taskId} 时出错: {ex.Message}"); await redisManager.AddTaskLog(taskId, $"删除缓存文件 {taskId} 时出错: {ex.Message}");
} }
} }
else
await redisManager.AddTaskLog(taskId, $"未识别到任务缓存: {path}");
return true; return true;
} }

View File

@ -1,4 +1,4 @@
using Downloader; using Downloader;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using SqlSugar; using SqlSugar;
using SqlSugar.IOC; using SqlSugar.IOC;
@ -94,15 +94,17 @@ namespace VideoAnalysisCore.Common
private readonly Repository<NodePackageInfo> packageInfoTaskDB; private readonly Repository<NodePackageInfo> packageInfoTaskDB;
private readonly Client vodClient; private readonly Client vodClient;
private readonly RedisManager redisManager; private readonly RedisManager redisManager;
private readonly IServiceProvider serviceProvider;
readonly string taskVideoName = "task.mp4"; readonly string taskVideoName = "task.mp4";
readonly string taskPPTVideoName = "ppt.mp4"; readonly string taskPPTVideoName = "ppt.mp4";
public DownloadFile(Repository<VideoTask> videoTaskDB, Client vodClient, Repository<NodePackageInfo> nackageInfoTaskDB, RedisManager redisManager) public DownloadFile(Repository<VideoTask> videoTaskDB, Client vodClient, Repository<NodePackageInfo> nackageInfoTaskDB, RedisManager redisManager, IServiceProvider serviceProvider)
{ {
this.videoTaskDB = videoTaskDB; this.videoTaskDB = videoTaskDB;
this.vodClient = vodClient; this.vodClient = vodClient;
this.packageInfoTaskDB = nackageInfoTaskDB; this.packageInfoTaskDB = nackageInfoTaskDB;
this.redisManager = redisManager; this.redisManager = redisManager;
this.serviceProvider = serviceProvider;
} }
// 根据 Content-Type 映射文件后缀 // 根据 Content-Type 映射文件后缀
@ -267,7 +269,26 @@ namespace VideoAnalysisCore.Common
{ {
if (download.Status == DownloadStatus.Failed && e.Error != null) if (download.Status == DownloadStatus.Failed && e.Error != null)
{ {
res.SetException(e.Error); // 检查磁盘空间不足异常
if (e.Error.Message.Contains("not enough space on the disk", StringComparison.OrdinalIgnoreCase))
{
Console.WriteLine($"{DateTime.Now} 下载失败:磁盘空间不足。尝试清理缓存...");
try
{
using var scope = serviceProvider.CreateScope();
var clearJob = scope.ServiceProvider.GetRequiredService<TaskFileClearJob>();
await clearJob.Invoke();
}
catch (Exception ex)
{
Console.WriteLine($"清理缓存失败: {ex.Message}");
}
res.SetException(new Exception($"磁盘空间不足,下载失败。请手动清理盘符 {Path.GetPathRoot(localPath)}。详细错误:{e.Error.Message}"));
}
else
{
res.SetException(e.Error);
}
} }
else if (download.Status == DownloadStatus.Completed) else if (download.Status == DownloadStatus.Completed)
{ {

View File

@ -0,0 +1,74 @@
using Coravel.Invocable;
using System;
using System.IO;
using System.Threading.Tasks;
using VideoAnalysisCore.Common;
namespace VideoAnalysisCore.Job
{
/// <summary>
/// 每小时强制清理缓存文件夹下所有内容的任务
/// </summary>
public class ClearAllCacheJob : IInvocable
{
public Task Invoke()
{
try
{
var cacheDir = AppCommon.TaskCachedFile;
if (!Directory.Exists(cacheDir))
{
return Task.CompletedTask;
}
Console.WriteLine($"{DateTime.Now} 开始强制清理缓存目录: {cacheDir}");
// 获取所有子目录
var directories = Directory.GetDirectories(cacheDir);
var i = 0;
foreach (var dir in directories)
{
try
{
// 检查文件夹创建时间如果是30分钟前的则删除防止删除正在运行的任务
if (Directory.GetCreationTime(dir) < DateTime.Now.AddMinutes(-30))
{
Directory.Delete(dir, true);
i++;
}
}
catch (Exception ex)
{
// 正在使用的文件夹会抛出异常,忽略即可
Console.WriteLine($"清理目录 {dir} 时发生错误 (可能正在使用): {ex.Message}");
}
}
Console.WriteLine($"已删除过期缓存数量 {i}");
// 获取根目录下的散落文件
var files = Directory.GetFiles(cacheDir);
foreach (var file in files)
{
try
{
if (File.GetCreationTime(file) < DateTime.Now.AddHours(-1))
{
File.Delete(file);
Console.WriteLine($"已删除过期缓存文件: {file}");
}
}
catch (Exception ex)
{
Console.WriteLine($"清理文件 {file} 时发生错误: {ex.Message}");
}
}
}
catch (Exception ex)
{
Console.WriteLine($"强制清理缓存任务发生异常: {ex.Message}");
}
return Task.CompletedTask;
}
}
}

View File

@ -1,4 +1,4 @@
using AlibabaCloud.SDK.Vod20170321; using AlibabaCloud.SDK.Vod20170321;
using Coravel.Invocable; using Coravel.Invocable;
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http;
using System; using System;
@ -34,13 +34,13 @@ namespace VideoAnalysisCore.Job
public async Task DeleteTaskAllCachesAsync() public async Task DeleteTaskAllCachesAsync()
{ {
var startTime = -2; var startTime = 0;
var timeSpan = startTime - 999; var timeSpan = startTime - 999;
// 计算 {startTime} 天前已完成任务缓存 // 计算 {startTime} 天前已完成任务缓存
DateTime twoDaysAgo = DateTime.Now.AddDays(startTime); DateTime twoDaysAgo = DateTime.Now.AddDays(startTime);
DateTime endDaysAgo = DateTime.Now.AddDays(timeSpan); DateTime endDaysAgo = DateTime.Now.AddDays(timeSpan);
// 查询 2 天前任务执行完成的记录 // 查询 {startTime} 天前任务执行完成的记录
var completedTasks = videotaskDB.AsQueryable() var completedTasks = videotaskDB.AsQueryable()
.Where(t => ( .Where(t => (
//筛选 结束任务 或者 错误任务 //筛选 结束任务 或者 错误任务
@ -56,7 +56,7 @@ namespace VideoAnalysisCore.Job
foreach (var taskId in completedTasks) foreach (var taskId in completedTasks)
await ExpandFunction.DeleteTaskAllFileAsync(taskId, redisManager); await ExpandFunction.DeleteTaskAllFileAsync(taskId, redisManager);
} }
public async void DeleteTaskVideoCaches() public async Task DeleteTaskVideoCachesAsync()
{ {
try try
{ {
@ -90,8 +90,8 @@ namespace VideoAnalysisCore.Job
public async Task Invoke() public async Task Invoke()
{ {
Console.WriteLine($"{DateTime.Now} 执行=>{this.GetType().FullName}"); Console.WriteLine($"{DateTime.Now} 执行=>{this.GetType().FullName}");
DeleteTaskVideoCaches(); await DeleteTaskVideoCachesAsync();
DeleteTaskAllCachesAsync(); await DeleteTaskAllCachesAsync();
} }
} }
} }