>

큰 파일 (800k 행)에서 데이터를 가져 와서 람다 (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));

파라미터 data 가있는 곳   json_sheet 입니다  위 함수에 정의되어 있습니다. 그래서 data.length  (행 수) 800k + 대신 0을 얻습니다. 물론, 나는 data[0] 를 얻을 수 없습니다  어느 undefined 입니다 .

PS .: 파일에57.3mb가 있습니다-원인인지 확실하지 않습니다

도움을 주셔서 감사합니다.

  • 답변 # 1

    기본적으로 NodeJS는 문자열에 대한 NodeJS VM 메모리 제한과 충돌하여 전체 파일을 읽을 수 없었습니다.

    따라서해야 할 일은 다음과 같이 메모리 제한을 늘리는 것입니다.

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

    NodeJS의 메모리는 512MB에서 2048MB/2GB로 증가합니다

    그러나 이것은 많은 양의 값을 읽는 해결책 일뿐입니다.

    이와 같은 대량의 데이터를 위협하기 위해 NodeJS를 사용하지 않는 것이 좋습니다. 대신 판다와 같은 라이브러리를 사용하여 파이썬과 함께 가십시오.

    PS .: nodejs를 사용하여 데이터를 처리함으로써 나의 의견과 경험. 나는 nodejs가 그것을 위해 만들어진 것이라고 생각하지 않습니다.

관련 자료

  • 이전 GDAX 샌드 박스 상태?
  • 다음 selenium - 그게 - 브라우저에서 테스트를 실행할 수 없습니다