以下は、このSOの質問からのFirebase読み取りクエリのパフォーマンステストです。これを独自のFirebaseインスタンスに変更し、シーケンシャルテストを削除して、並列テストのみを残しました。
問題は、このコードを実行してforループを作成するとi < 12
、長さの配列が生成されることです:32,768
、コールスタックを超えたことを示すエラーが表示され続けます:RangeError: Maximum call stack size exceeded
しかし、このエラーの原因を特定できません...ローカルホストとクラウド機能の両方でテストしようとしましたが、成功しませんでした。
(参照されている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.527ZE helloWorld:RangeError:/ user_code / node_modules / firebaseのT(/user_code/node_modules/firebase-admin/lib/database/database.js:139:366)で最大コールスタックサイズを超えました-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.758741829ZD helloWorld:関数の実行に5107ミリ秒かかり、ステータスが「クラッシュ」で終了しました
誰かが何か洞察を持っていますか?/user_code/node_modules/firebase-admin/lib/database/database.js
ファイルを見てみましたが、縮小されているため、何が起こっているのか実際にはわかりません。
SDKのスタックの1つをオーバーフローしている、32,768を超える読み取り操作をキューに入れています。コードにフロー制御なしでその数のアイテムをロードするのは悪い考えのように思われるので、SDKがうまくいくことを実際に非常に嬉しく思います。より合理的なバッチでアイテムをロードすることを検討してください。
ただし、一般的には、データベースからの数千のアイテムの読み込みを制限するようにしてください。あなたが集計操作のための多くのアイテムが必要な場合は、している多くの優れたデータベースに明示的に集計値を維持し、すべての書き込み操作でそれを更新オフ。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加