【问题标题】:Inserting a large amount of data (Node.js API)插入大量数据(Node.js API)
【发布时间】:2021-09-11 11:32:07
【问题描述】:

在我的 Node.js API 中,我解析了一个 CSV 文件。我得到所有行以将它们插入数据库。我正在使用 Sequelize 和 Mysql。问题是Sequelize 1分钟后超时,1分钟内处理了1000行,而CSV文件大约有40000行。

在我的程序中,我将所有数据存储在一个对象中,然后我有一个循环将逐行存储在我的数据库中。这是我所拥有的示例:

const csv = require('ya-csv');

const Globale = require('./models/globale.model');
const file = 'myFile.csv';
const result = [];

exports.csvToDb = (req, res) => {
  var reader = csv.createCsvFileReader(file, {columnsFromHeader: true, 'separator': ','});
  reader.addListener('data', function(data) {
    result.push(data);
  })
  reader.addListener('end', function() {
    try {
      for (var i = 0; i < result.length; i++) {
        Globale.create({
          id: result[i].id,
        })
        .then(() => {
          console.log("Record added");
        })
        .catch(err => {
          console.error(err);
        })
      }
      res.status(200).json({ message: 'All record uploaded' });
    } catch (err) {
      res.status(500).json({ message: err.message });
    }
  });
};

你有办法更快地处理这个问题吗?和/或延长续集超时?提示

【问题讨论】:

    标签: javascript node.js


    【解决方案1】:

    您的方法的问题是,您正在对 for 循环进行 40.000 次迭代,这会使您的数据库受到 40.000 个并发请求的影响。

    为了不使您的数据库不堪重负,您可以等待每次插入:

    reader.addListener('end', async function () {
        try {
            for (var i = 0; i < result.length; i++) {
                await Globale.create({ id: result[i].id })
            }
            res.status(200).json({ message: 'All record uploaded' });
        } catch (err) {
            res.status(500).json({ message: err.message });
        }
    });
    

    但是,这也很慢,因为它会进行 40.000 次调用,尽管是一个一个调用而不是同时调用。必须有某种Globale(我不知道)的方法来批量插入大量文档。

    【讨论】:

      【解决方案2】:

      好吧,在这种情况下,您可能应该使用bulk create sequelize 方法,在一个查询中发送所有数据。

      const csv = require('ya-csv');
      
      const Globale = require('./models/globale.model');
      const file = 'myFile.csv';
      const result = [];
      
      exports.csvToDb = (req, res) => {
        var reader = csv.createCsvFileReader(file, {columnsFromHeader: true, 'separator': ','});
        reader.addListener('data', function(data) {
          result.push(data);
        })
        reader.addListener('end', async function() {
          try {
            await Globale.bulkCreate(result.map(item => ({ id: item.id }))
            res.status(200).json({ message: 'All record uploaded' });
          } catch (err) {
            res.status(500).json({ message: err.message });
          }
        });
      };
      

      【讨论】:

        猜你喜欢
        • 2021-12-24
        • 2019-11-22
        • 1970-01-01
        • 2013-12-05
        • 1970-01-01
        • 2017-12-28
        • 2013-01-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多