Frage

Ich habe die Unterschrift auf eine Datei, um zu überprüfen, die als 2 GB groß sein kann, und ich möchte dies in einer Weise tun, die als speichereffizient wie möglich ist. Aus verschiedenen Gründen wird bereits die Datei vollständig in den Speicher geladen werden und wird unter Verwendung eines InputStream durch die Anwendung zugegriffen. Ich möchte die Signatur mit dem Strom-Schnittstelle, um zu überprüfen, aber die JCA Signature Klasse update Methode akzeptiert nur byte[] und verwandte Klassen.

Wie kann ich dies effizient? Ich möchte nicht, das Tier in einen zweiten Byte-Array laden, sonst werden wir einig ernsthaft hohen Speicherverbrauch sehen werden, aber die Schnittstelle scheint nicht anders zu unterstützen.

Aktualisieren

Wenn es darauf ankommt, der Signieralgorithmus ist SHA-1

War es hilfreich?

Lösung

Warum nicht einfach lesen Sie die Eingabe ein Block-Stream (4096bytes oder was auch immer bequem Größe) zu einem Zeitpunkt, Call update () für jeden Block.

Andere Tipps

Erstellen Sie ein Byte-Array, um als Puffer und lesen Sie zu einem Zeitpunkt aus dem Input Puffer, update () aufrufen, auf der Unterschrift jedes Mal. Sofern der Puffer einer angemessenen Größe ist, verbrauchen die CPU-Zeit, die Daten von einem Prozess zu einem anderen wechseln (ich vermute, das ist, was du tust?) Dürfte im Vergleich zu der Berechnungszeit vernachlässigbar. Im Fall des von der Platte zu lesen, der Cut-off-Punkt für vernachlässigbar Rückkehr auf dem CPU-Auslastung wird eine Puffergröße von etwa 8K, zu sein, und ich vermute, dass dies mehr oder weniger auch in Ihrem Fall zutreffen. (Im Fall ist es interessant, finden Sie auf der Seite, die ich zusammen auf Inputpuffergrößen ).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top