@Frotryi
Живу не тужу

Как избежать утечки памяти в nodejs при парсинге xlsx файлов?

Мой код:

export async function getDataExel(file: Buffer): Promise<any[]> {
    const workbook = xlsx.read(file, { type: 'buffer' });
    const sheetName = workbook.SheetNames[0];
    const sheet = workbook.Sheets[sheetName];
    return xlsx.utils.sheet_to_json(sheet, { header: 1 }).slice(3, -1);
}

export async function downloadAndProcessExcel(url: string) {
    try {
        let response = await axios.get(url, {
            responseType: 'arraybuffer'
        });
        return await getDataExel(response.data);
    } catch (error) {
        console.error('Ошибка при загрузке и обработке файла:', error);
        return [];
    }
}

export async function main() {
    console.log("Start");

    await ArticleService.deleteAll('juna');
    const settings = await SettingsService.getData();
    const links = await fetchLinks();

    for (const link of links) {
        console.log(link);
        try {
            const result = await downloadAndProcessExcel('https://price.juna-life.ru' + link);
            // await processAndSaveData(result, settings);
        } catch (e) {
            console.error(`Ошибка при обработке ссылки ${link}:`, e);
        }
    }

    console.log("Finish");
}

// Start Script

import { main } from "./parserJuna";

// Функция для получения текущего использования памяти
function logMemoryUsage() {
    const used = process.memoryUsage();
    const rss = (used.rss / 1024 / 1024).toFixed(2);
    console.log(`RSS: ${rss} MB`);
}

// Основная функция
async function start() {
    console.log("Start");

    const interval = setInterval(() => {
        logMemoryUsage();
    }, 5000); // Логирование каждые 5 секунд

    const executeTask = async () => {
        await main();
    };

    await executeTask();

    setInterval(executeTask, 172_800_000);

    console.log("End of the process");
}

start();

Я хочу, чтобы этот скрипт каждые 48 часов собирал данные, но возникает ситуация, что при сборе данных в оперативную память накачиваются данные, и не очищаются. Например, в первый раз накопилось 3ГБ данных, в следующий раз ещё 3, итого 6, и так далее. Как это исправить?
  • Вопрос задан
  • 92 просмотра
Пригласить эксперта
Ответы на вопрос 1
1. Используй ReadableStream
2. Нет смысла держать программу запущенной все время, если она запускается лишь раз в 2 сутки. Когда она завершится, память автоматически освободится обратно к ОС. Используй планировщик задач ОС.
3. Можно скачивать файлы на хранилище вместо того, чтобы держать в памяти. Затем подчищать.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы