Wie ändere ich das Pufferlimit in Google's Protobuf?

8

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.

    
Mohammad Moghimi 12.12.2012, 22:01
quelle

3 Antworten

8

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.

    
joydeepb 12.12.2012, 22:31
quelle
8

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.

Quelle

Es ist auch wahrscheinlich eine gute Idee, den ersten Teil des Rates zu befolgen und die Anwendung neu zu gestalten.

    
Voo 12.12.2012 22:17
quelle
3

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%     
5argon 03.02.2016 09:00
quelle

Tags und Links