Ich bekomme diese Warnung und später einen Fehler, wenn ich versuche, eine große Nachricht zu parsen. Ich weiß als 64 MB, das ist das Standardlimit. Ich verwende jetzt message.ParseFromIstream. Kennt jemand Zugriff auf das CodedInputStream-Objekt, um die SetTotalBytesLimit-Funktion aufzurufen? oder eine andere Möglichkeit, dieses Problem zu lösen?
Lesen Sie gefährlich große Protokollnachricht. Wenn die Nachricht ausgeht Um größer als 67108864 Bytes zu sein, wird das Parsing aus Sicherheitsgründen angehalten Gründe dafür. Informationen zum Erhöhen des Grenzwerts (oder zum Deaktivieren dieser Warnungen) finden Sie unter CodedInputStream :: SetTotalBytesLimit () in google / protobuf / io / coded_stream.h.
Die richtige Lösung: Sie sollten versuchen, die Größe Ihrer protobuf-Nachrichten zu begrenzen. Bitte sehen Sie: Ссылка
Der schnelle und schmutzige Ansatz (nicht empfohlen):
Ändern Sie in der Datei "coded_stream.h" der protobuf-Bibliotheksquelle die Werte von kDefaultTotalBytesLimit
und kDefaultTotalBytesWarningThreshold
, kompilieren Sie sie neu und installieren Sie sie neu.
Wenn Sie nur die Dokumentation der Funktion gelesen haben, über die der Fehler bereits bekannt war, hätte Sie diese Frage beantwortet:
Tipp: Wenn Sie dies lesen, weil Ihr Programm gerade druckt a Warnung vor gefährlich großen Protokollnachrichten, Sie könnten verwirrt sein darüber, was als nächstes zu tun ist. Die beste Option ist es, Ihr Design zu ändern dass übermäßig große Nachrichten nicht notwendig sind. Versuchen Sie zum Beispiel Design-Dateiformate bestehen aus vielen kleinen Nachrichten statt a Single groß. Wenn dies nicht möglich ist, müssen Sie den Wert erhöhen Grenze. Wahrscheinlichkeiten sind jedoch, dass Ihr Code nie ein CodedInputStream, auf dem das Limit festgelegt werden kann. Sie analysieren wahrscheinlich Nachrichten durch den Aufruf von Dingen wie Message :: ParseFromString (). In diesem Fall, müssen Sie Ihren Code ändern, um stattdessen eine Art zu konstruieren von ZeroCopyInputStream (z. B. ein ArrayInputStream), konstruiere a CodedInputStream um, dann anruft Message :: ParseFromCodedStream () stattdessen. Dann kannst du das einstellen Grenze. Ja, es ist mehr Arbeit, aber du machst etwas Ungewöhnliches.
Es ist auch wahrscheinlich eine gute Idee, den ersten Teil des Rates zu befolgen und die Anwendung neu zu gestalten.
Hier ist ein Kommentar aus dem Code ( google/protobuf/io/coded_stream.h
), die das Nachrichtenlimit für diejenigen festlegen, die sich fragen, aus welchem Sicherheitsgrund sie sprechen. In meinem Fall kann ich nicht ändern, wie meine Anwendung funktioniert, also muss ich dieses Limit ändern.
Dieser Thread ist ziemlich alt, aber in letzter Zeit hat tiefes Lernen Aufmerksamkeit bekommen und die Bibliothek Caffe hat Protobuf benutzt, also werden vielleicht mehr Leute darüber stolpern. Ich muss neuronales Netzwerk mit Caffe machen, und das ganze Netzwerk hat so viel Speicher gekostet, selbst bei kleinsten Batch-Größen.
%Vor%Tags und Links c++ protocol-buffers