perf: оптимизация памяти - кэширование только текущей недели и условный парсинг Критические оптимизации для снижения потребления памяти с 1.2 ГБ: - Кэширование только текущей недели: * Кэш хранит только текущие недели (без параметра wk) * Запросы с конкретной неделей (wk указан) не кэшируются * Ключ кэша изменен с ${group}_${wk} на group * Уменьшен maxCacheSize с 100 до 50 записей - Условный парсинг навигации по неделям: * Парсинг навигации выполняется только если weekNavigationEnabled === true * Если навигация выключена, parseWeekNavigation не вызывается * Экономит память и CPU при выключенной навигации * Параметр shouldParseWeekNavigation передается через getSchedule -> parsePage - Результат: * Значительное снижение потребления памяти * Кэш содержит только актуальные данные (текущие недели) * Парсинг навигации выполняется только при необходимости Измененные файлы: - src/pages/[group].tsx - логика кэширования только текущей недели - src/app/agregator/schedule.ts - параметр для условного парсинга - src/app/parser/schedule.ts - условный вызов parseWeekNavigation

Критические оптимизации для снижения потребления памяти

- Кэширование только текущей недели:
  * Кэш хранит только текущие недели (без параметра wk)
  * Запросы с конкретной неделей (wk указан) не кэшируются
  * Ключ кэша изменен с `${group}_${wk}` на `group`
  * Уменьшен maxCacheSize с 100 до 50 записей

- Условный парсинг навигации по неделям:
  * Парсинг навигации выполняется только если weekNavigationEnabled === true
  * Если навигация выключена, parseWeekNavigation не вызывается
  * Экономит память и CPU при выключенной навигации
  * Параметр shouldParseWeekNavigation передается через getSchedule -> parsePage

- Результат:
  * Значительное снижение потребления памяти
  * Кэш содержит только актуальные данные (текущие недели)
  * Парсинг навигации выполняется только при необходимости

Измененные файлы:
- src/pages/[group].tsx - логика кэширования только текущей недели
- src/app/agregator/schedule.ts - параметр для условного парсинга
- src/app/parser/schedule.ts - условный вызов parseWeekNavigation
This commit is contained in:
kilyabin
2025-11-23 02:38:09 +04:00
parent 2893a9fd18
commit b1f892ca7d
4 changed files with 79 additions and 33 deletions

View File

@@ -13,22 +13,32 @@ export type ScheduleResult = {
}
// ПС-7: 146
export async function getSchedule(groupID: number, groupName: string, wk?: number): Promise<ScheduleResult> {
export async function getSchedule(groupID: number, groupName: string, wk?: number, parseWeekNavigation: boolean = true): Promise<ScheduleResult> {
const url = `${PROXY_URL}/?mn=2&obj=${groupID}${wk ? `&wk=${wk}` : ''}`
const page = await fetch(url)
// const page = { text: async () => mockContent, status: 200, headers: { get: (s: string) => s && 'text/html' } }
const content = await page.text()
const contentType = page.headers.get('content-type')
if (page.status === 200 && contentType && contentTypeParser.parse(contentType).type === 'text/html') {
let dom: JSDOM | null = null
try {
const root = new JSDOM(content, { url }).window.document
const result = parsePage(root, groupName, url)
return {
dom = new JSDOM(content, { url })
const root = dom.window.document
const result = parsePage(root, groupName, url, parseWeekNavigation)
const scheduleResult = {
days: result.days,
currentWk: result.currentWk || wk,
availableWeeks: result.availableWeeks
}
// Явно очищаем JSDOM для освобождения памяти
dom.window.close()
dom = null
return scheduleResult
} catch(e) {
// Очищаем JSDOM даже в случае ошибки
if (dom) {
dom.window.close()
}
console.error(`Error while parsing ${PROXY_URL}`)
reportParserError(new Date().toISOString(), 'Не удалось сделать парсинг для группы', groupName)
throw e