0

我正在尝试从一个巨大的文件(800k 行)中获取数据并通过 lambda(AWS)将其放入数据库中。为此,我从 S3 获取 xlsx 文件作为缓冲区并读取它。

module.exports.getSalesData = new Promise((resolve, reject) => {
  getFileFromS3(filename)
    .then(function (workbook) {
      console.log(workbook.SheetNames[1]); // 'sales'
      console.log(workbook.SheetNames); // showing sales as [ 'main', 'sales', 'Sheet1' ]
      console.log(Array.isArray(workbook.SheetNames)); // true
      console.log(typeof workbook.SheetNames); // Object
      console.log(Object.keys(workbook.Sheets)); // [ 'main', 'Sheet1' ] == why 'sales' is not here?

      var sheet_name = workbook.SheetNames[1]; // sales tab
      var json_sheet = XLSX.utils.sheet_to_json(workbook.Sheets[sheet_name], { raw: true })
      resolve(json_sheet)
    })
    .catch(err => {
      console.log('File: ' + filename + ' doesn\'t exists on S3 or you\'re not connected to the internet.');
    })
})

问题是workbook.Sheets我应该看到[ 'main', 'sales', 'Sheet1' ],对吧?

然后我尝试像这样获取行数(已经转换为 JSON):

getSalesData.then(function (data) {
    console.log(data.length + ' rows');
    console.log(data[0]);
  }).catch(err => console.error(err));

其中参数datajson_sheet在上面的函数中定义的。所以对于data.length(行数)我得到 0 而不是 800k+。而且,当然,我无法得到data[0]which is undefined

PS.:该文件有57.3mb - 不确定是否是原因。

提前感谢您的帮助。

4

1 回答 1

1

所以基本上发生的事情是 NodeJS 无法读取完整的文件,因为它会破坏 NodeJS VM 的字符串内存限制。

所以我必须做的是像这样增加内存限制:

node --max-old-space-size=2048 services/process/process-sales.js

NodeJS 的内存将从 512MB 增加到 2048MB / 2GB。

但这只是读取大量值的解决方案。

我不建议使用 NodeJS 来威胁这样的大量数据。而是使用 Python 使用像Pandas这样的库,这很棒。

PS.:只是我使用nodejs处理数据的看法和经验。我不认为 nodejs 是为此而生的。

于 2018-03-09T15:31:29.500 回答