2017-12-20 5 views
0

아래의 firebase 읽기 쿼리 성능 테스트는 this SO 질문입니다. 방금 firebase 인스턴스로 변경하고 순차 테스트를 제거하여 병렬 테스트 만 제거했습니다.Firebase RangeError : 최대 호출 스택 크기 초과

문제는 내가이 코드를 실행 언제든지 내가 만드는 것입니다 길이의 배열의 결과로 루프 i < 12에 대한 : 32,768, 나는 그 호출 스택을 초과라는 오류가 계속 : RangeError: Maximum call stack size exceeded하지만 난 알아낼 수있는 이 오류를 일으키는 중 ... 나는 localhost 및 구름 함수를 통해 테스트했지만 아무런 성공도 시도하지 못했습니다.

(참조 된 SO 테스트는 i < 12에서 작동하지만 13으로 변경하면 끊어짐).

function loadVideosParallel(videoIds, callback) { 
    Promise.all(
    videoIds.map((id) => { 
     return admin.database().ref("test").child(id).once('value') 
     .then((snapshot) => { 
      return snapshot; 
     }) 
    }) 
).then((r) => callback()); 
} 

function loadVideosForUser(loadVideosParallel, callback) { 
    admin.database().ref("test").once('value').then((snapshot) => { 
    var videoKeys = Object.keys(snapshot.val()); 

    for (var i=0; i < 13; i++) { 
     videoKeys = videoKeys.concat(videoKeys); 
    } 

    loadVideosParallel(videoKeys, function() { 
     if (callback) callback(); 
    }); 
    }) 
} 

let start = Date.now(); 
loadVideosForUser(loadVideosParallel, function() { 
    const endTime = (Date.now() - start)+'ms'; 
    console.log('parallel done after '+ endTime +'ms'); 
}); 

2017-12-20T23:26:28.527Z E helloWorld: RangeError: Maximum call stack size exceeded at T (/user_code/node_modules/firebase-admin/lib/database/database.js:139:366) at /user_code/node_modules/firebase-admin/lib/database/database.js:190:120 at ta (/user_code/node_modules/firebase-admin/lib/database/database.js:45:40) at ua (/user_code/node_modules/firebase-admin/lib/database/database.js:45:89) at Ag (/user_code/node_modules/firebase-admin/lib/database/database.js:190:93) at /user_code/node_modules/firebase-admin/lib/database/database.js:195:260 at Oc (/user_code/node_modules/firebase-admin/lib/database/database.js:85:363) at Oc (/user_code/node_modules/firebase-admin/lib/database/database.js:85:449) at Oc (/user_code/node_modules/firebase-admin/lib/database/database.js:85:449) at Nc (/user_code/node_modules/firebase-admin/lib/database/database.js:85:316) 2017-12-20T23:26:29.758741829Z D helloWorld: Function execution took 5107 ms, finished with status: 'crash'

누구나 어떤 통찰력을 가지고? 나는 /user_code/node_modules/firebase-admin/lib/database/database.js 파일을 보았지만 축소되었으므로 실제로 어떤 일이 일어 났는지 알 수는 없습니다.

+1

불편한 코드를보고 싶다면 : https://github.com/firebase/firebase-admin-node –

+0

질문을하기 전에 거기에 쳐다 보았지만 데이터베이스/database.ts 파일에는 동일하지 않습니다. 훨씬 더 짧아. – linasmnew

답변

1

SDK의 스택 중 하나가 오버플로되는 32,768 건 이상의 읽기 작업을 대기열에 넣었습니다. 코드에서 흐름 제어를 사용하지 않고 많은 항목을로드하는 것은 입니다. 아이디어이므로 SDK 실행이 실제로 만족 스럽습니다. 보다 합리적인 배치로 항목로드를 고려하십시오.

일반적으로 데이터베이스에서 수천 개의 항목로드를 제한하려고 시도합니다. 집계 연산에 많은 항목이 필요한 경우 이 많으므로은 데이터베이스에 집계 된 값을 명시 적으로 유지하고 모든 쓰기 작업으로 업데이트하는 것이 더 좋습니다.

+0

답변을 주셔서 감사합니다.하지만 순차적 부분을 제거하고 병렬 테스트 만 수행 한 후 참조 된 테스트에서 32,768 개의 읽기 연산이 작동하는 이유는 무엇입니까? 하지만 로컬 호스트 나 내 자신의 클라우드 기능으로 복사하면 더 이상 작동하지 않습니까? – linasmnew

+0

테스트의 동기는 내가 fanout-on-read 대 fanout-on-write가 활동 피드와 어떻게 다른지를 알아 내려고한다는 것입니다. – linasmnew

관련 문제