записывать большие данные в файл с помощью excel4node и загружать его, используя много времени, и блокирует все другие операции ввода-вывода - PullRequest
1 голос
/ 18 апреля 2019

Я получаю большое количество данных примерно 250000+ строк из коллекции mongodb и записываю эти данные в файл, используя библиотеку excel4node. Но проблема в том, что все другие операции ввода-вывода блокируются, а сам запрос останавливается, но когда я пытаюсьзаписать небольшой кусок данных все работает нормально Ниже приведен мой код

router.get('/', async (req, res) => {
    let msisdn = [];
    let event_id = [];
    let event_datetime = [];
    let cost = [];
    let network_type = [];
    let a_party = [];
    let b_party = [];
    let duration = [];
    let packageplan = [];
    let net_val = [];
    let net_iden = [];
    try {
        let data = await
            mongoose.connection.db.collection(req.query.logs).find({}).toArray();
        if (data.length != 0) {
            for (var d of data) {
                msisdn.push(d.customer_msisdn);
                event_id.push(d.event_id);
                event_datetime.push(d.event_date_time);
                cost.push(d.cost);
                network_type.push(d.network_type);
                a_party.push(d.a_party_number);
                b_party.push(d.b_party_number);
                duration.push(d.duration);
                packageplan.push(d.package_plan);
                net_val.push(d.network_value);
                net_iden.push(d.network_identifier);

            }
        }
        var workbook = new excel.Workbook();

        // Add Worksheets to the workbook
        var worksheet = workbook.addWorksheet('Sheet 1');

        // Create a reusable style
        var style = workbook.createStyle({
            font: {
                size: 12
            }
        });
        let filepath = path.join(__dirname, '../') + req.query.logs + '.xlsx';
        workbook.write(req.query.logs + '.xlsx');
        let headers = ['MSISDN', 'Event ID', 'Event Date Time', 'Cost( PKR )', 'Network Type', 'A Party Number', 'B Party Number', 'Duration( Sec )', 'Package Plan', 'Network Value', 'Network Identifier', 'Event LifeCycle']
        // Set value of cell A1 to 100 as a number type styled with paramaters of style
        worksheet.column(1).setWidth(20)
        worksheet.column(3).setWidth(30)
        worksheet.column(5).setWidth(20)
        worksheet.column(6).setWidth(20)
        worksheet.column(7).setWidth(20)
        worksheet.column(8).setWidth(20)
        worksheet.column(9).setWidth(30)
        worksheet.column(10).setWidth(25)
        worksheet.column(11).setWidth(25)
        worksheet.column(11).setWidth(20)
        for (var i = 0; i < headers.length; i++) {
            worksheet.cell(1, i + 1).string(headers[i]).style(style);
        }
        for (var j = 0; j < msisdn.length; j++) {
            let t = 2;
            worksheet.cell(t + j, 1).string(msisdn[j]).style(style);
            worksheet.cell(t + j, 2).string(event_id[j]).style(style);
            worksheet.cell(t + j, 3).string(event_datetime[j]).style(style);
            worksheet.cell(t + j, 4).string(cost[j]).style(style);
            worksheet.cell(t + j, 5).string(network_type[j]).style(style);
            worksheet.cell(t + j, 6).string(a_party[j]).style(style);
            worksheet.cell(t + j, 7).string(b_party[j]).style(style);
            worksheet.cell(t + j, 8).string(duration[j]).style(style);
            worksheet.cell(t + j, 9).string(packageplan[j]).style(style);
            worksheet.cell(t + j, 10).string(net_val[j]).style(style);
            worksheet.cell(t + j, 11).string(net_iden[j]).style(style);


        }
        workbook.write(filepath, async (err, stats) => {
            if (err) {
                console.error(err);
            }
            else {
                res.sendFile(filepath);
            }
        });

    }
    catch (e) {
        console.log(e);
    }
});
...