동시에 업로드할 수 있는 파일의 메모리 용량을 제한하여 메모리 부족으로 인해 발생하던 크래시 해결

This commit is contained in:
static
2026-01-02 23:00:25 +09:00
parent 008c8ad6ba
commit 83d595636b
10 changed files with 213 additions and 200 deletions

View File

@@ -0,0 +1,41 @@
export class Scheduler<T = void> {
private tasks = 0;
private memoryUsage = 0;
private queue: (() => void)[] = [];
constructor(public memoryLimit = 100 * 1024 * 1024 /* 100 MiB */) {}
private next() {
if (this.memoryUsage < this.memoryLimit) {
this.queue.shift()?.();
}
}
async schedule(estimateMemoryUsage: () => Promise<number>, task: () => Promise<T>) {
if (this.tasks++ > 0) {
await new Promise<void>((resolve) => {
this.queue.push(resolve);
});
}
while (this.memoryUsage >= this.memoryLimit) {
await new Promise<void>((resolve) => {
this.queue.unshift(resolve);
});
}
let taskMemoryUsage = 0;
try {
taskMemoryUsage = await estimateMemoryUsage();
this.memoryUsage += taskMemoryUsage;
this.next();
return await task();
} finally {
this.tasks--;
this.memoryUsage -= taskMemoryUsage;
this.next();
}
}
}