使用PapaParse处理Meteor JS中的大型CSV

时间:2016-12-30 23:02:09

标签: csv meteor amazon-s3 fs papaparse

我见过很多关于PapaParse和大文件的讨论,但没有一个能解决我的情况。感谢您的任何建议。

目标

  1. 用户从客户端上传CSV,然后创建字段地图(CSV到系统字段中的列)
  2. 文件已加载到Amazon S3
  3. 在服务器上启动进程以从S3获取文件并解析它,然后处理每一行。
  4. 整个过程都有效,直到我达到大约20,000行。然后我得到:

    FATAL ERROR: invalid table size Allocation failed - process out of memory

    当我尝试从S3获取文件然后通过fs.writeFileSync将其存储在本地时,似乎发生了内存崩溃。我想我可以通过s3.getObject(params).createReadStream()从S3流式传输文件,但这不会返回行,只是块。

    这是我的代码。我想跳过fs.writeFileSync()步骤,只是从S3读取,但是当我通过PapaParse尝试时,我得到[]而BabyParse不接受文件。

    我可以从s3.getObject(params).createReadStream()返回的块中获取行并解析它们吗?

    S3.aws.getObject( getS3params, Meteor.bindEnvironment( function ( error, response ) {
      if ( error ) {
        console.log( 'getObject error:' );
        console.log( error );
      } else {
        console.log( 'Got S3 object' );
    
        let s3file      = response.Body,
            csvFile     = 'path/to/file.csv',
            writeFile   = fs.writeFileSync( csvFile, s3file ), // write CSV to local server -- this seems really silly. Want to just read from S3
            parsed      = Baby.parseFiles( csvFile, { // Note: using BabyParse not PapaParse
                            header: true,
                            step: function ( results, parser ) {
                              let thisItem = results.data[0];
                              // process this row
                            }
                          }),
            deleteFile  = fs.unlinkSync( csvFile ); // remove local CSV
      }
    })); // end S3.getObject
    

    有什么想法吗?谢谢!

0 个答案:

没有答案