Firestore с несколькими партиями не выполняется с превышением конечного срока [дубликат]

RuntimeException не требует компиляции try или catch в начале метода. Просто потому, что это происходит во время выполнения, например, вы хотите передать 14-й элемент массива длиной 10 элементов или получить исключение NullPointerException, потому что вы забыли установить значение чего-то, эти случаи не могут быть предсказаны, так как программа будет хорошо работать с правильными структурами. Также, как говорят другие, это не проверено.

Исключение отличается, вы должны сказать программе, что делать с известными случаями исключения. Это означает, что complier заставит вас обработать исключение так или иначе, прежде чем он начнет работать.

4
задан Frank van Puffelen 9 October 2017 в 21:42
поделиться

2 ответа

Я написал этот маленький скрипт, который использует пакетные записи (макс. 500) и записывает только одну партию за другой.

использовать его, сначала создавая batchWorker let batch: any = new FbBatchWorker(db); Затем добавьте что-нибудь к рабочему batch.set(ref.doc(docId), MyObject);. И закончите его через batch.commit(). Api такой же, как для обычной Firestore Batch ( https://firebase.google.com/docs/firestore/manage-data/transactions#batched-writes ) Однако в настоящее время он поддерживает только set.

import {firestore} from "firebase-admin";


export default class FbBatchWorker {

    db: firestore.Firestore;
    batchList: FirebaseFirestore.WriteBatch[] = [];
    elemCount: number = 0;

    constructor(db: firestore.Firestore) {
        this.db = db;
        this.batchList.push(this.db.batch());
    }

    async commit(): Promise<any> {
        let batchProms: Promise<any>[] = [];

        for (let _batch of this.batchList) {
            (await _batch.commit());
            console.log("finished writing batch");
            // batchProms.push(_batch.commit());
        }

        // return Promise.all(batchProms);
        return Promise.resolve("yeah");
    }

    set(dbref: FirebaseFirestore.DocumentReference, data: any): void {
        this.elemCount = this.elemCount + 1;
        if (this.elemCount % 490 === 0) {
            this.batchList.push(this.db.batch());
        }
        this.batchList[this.batchList.length - 1].set(dbref, data);
    }

}
1
ответ дан Jürgen Brandstetter 15 August 2018 в 16:15
поделиться

Firestore имеет пределы.

Вероятно, «Deadline Exceeded» происходит из-за его пределов.

См. это. https://firebase.google.com/docs/firestore/quotas

Максимальная скорость записи в документ 1 в секунду

https://groups.google.com/forum/#!msg/google-cloud-firestore-discuss/tGaZpTWQ7tQ/NdaDGRAzBgAJ

4
ответ дан Nobuhito Kurose 15 August 2018 в 16:15
поделиться
  • 1
    любое обходное предложение по этому поводу? Я хочу, чтобы начальный импорт данных из 1500000 данных обрабатывался с помощью узла. Любое предложение оценили. – KD. 19 January 2018 в 17:08
  • 2
    @KD. 1 раз в секунду для документа. Для базы данных предел равен «Максимальная запись в секунду для каждой базы данных». 2,500 (до 2,5 Мбайт в секунду) ". вы можете избежать этих ограничений, используя setTimeout, хотя это требует времени. – Nobuhito Kurose 21 January 2018 в 07:21
  • 3
    Благодарю. Добавление таймаута было бы моим последним вариантом, так как у меня слишком много данных для начального ввода. Я очень хочу, чтобы был способ импортировать JSON так же, как в режиме реального времени. На данный момент я собираюсь в режиме реального времени, так как тот же подход отлично работает с ним. – KD. 21 January 2018 в 07:24
  • 4
    Я "решил" это с двумя шагами. 1) Я использую пакетную запись. И установите партию в 490 (max, по-видимому, 500). 2) Я жду, что каждая партия закончилась, прежде чем я отправлю следующий. – Jürgen Brandstetter 22 February 2018 в 17:07
Другие вопросы по тегам:

Похожие вопросы: