3 Stimmen

Umgang mit massiven speicherinternen Objekten in .NET

Im Wesentlichen habe ich eine sehr große Liste, die wiederum relativ große Wörterbücher enthält.

Im Grunde habe ich also eine sehr große Speichersammlung.

Ich dann serialisieren diese Sammlung manuell zu XML, und senden Sie es über http. unnötig zu sagen, die XML ist zu groß, manchmal so groß ich eine OutOfMemory-Ausnahme erhalten, bevor sogar versuchen, es zu senden.

Wie würde ich in .NET vorgehen, um die potenzielle Speichernutzung zu berechnen? In diesem Fall muss ich zum Beispiel die XML-Datei in Stücke zerlegen, indem ich nur kleine Teile der Sammlung auf einmal verarbeite.

Wie berechne ich effizient die Größe der einzelnen "Chunks" im Handumdrehen? Ich möchte keine willkürliche Zahl festlegen, wie z. B. "100 Artikel gleichzeitig verarbeiten", Ich möchte ungefähr wissen, wie groß die einzelnen Stücke von Fall zu Fall sein sollten.

Prost

UPDATE

Obwohl @Jacob die beste Lösung für dieses spezielle Problem geliefert hat, ist die konzeptionelle Struktur der App selbst mangelhaft.

Die Lösung besteht in der Tat darin, einen Bruchteil Ihrer Nachricht auszuführen, um zu berechnen, wie groß die Nachricht möglicherweise sein wird, wenn Sie mit einer Sammlung arbeiten.

Sie senden dann jede Einheit in akzeptabler Größe, eine nach der anderen.

Aber das ist nur ein Hacken. Die eigentliche Lösung besteht darin, entweder einen Weg zu finden, keine großen Nachrichten zu übermitteln, oder ein völlig anderes Protokoll zu verwenden.

Es gibt eine interessanter Beitrag zu diesem Thema hier wenn Sie SOAP verwenden möchten, habe ich jedoch beschlossen, einen Weg zu finden, um so viele Daten zu senden.

0 Stimmen

Haben Sie eine weniger ausführliche Form der Übermittlung als XML in Betracht gezogen? Oder ist XML in Stein gemeißelt?

0 Stimmen

Hey Chris, ja, das habe ich jetzt. Aber egal, wie sehr ich komprimiere, ich muss es vielleicht trotzdem in Stücken schicken. Ich bin eher neugierig und besorgt darüber, wie ich das hinbekomme. cheers though

6voto

albertein Punkte 25058

Warum streamen Sie die Daten nicht einfach, so dass Sie die Konvertierung in XML im laufenden Betrieb vornehmen können, ohne eine große XML-Datei im Speicher zu haben?

0 Stimmen

@albertein. hey albert, danke. Ich habe noch nie gestreamt. Könntest du das genauer erklären und aufschlüsseln? danke

0 Stimmen

@andy zuerst muss ich wissen, wie Sie planen, es über http zu senden, sagen Sie mir, wenn Sie eine riesige im Speicher Zeichenfolge mit der xml hatte, was würden Sie mit dem tun?

0 Stimmen

@albert: Gute Frage. Ich sende es über SOAP. Ich denke, ich möchte jetzt nicht alles ändern, aber es gibt hier definitiv einen Fehler in meiner Anwendung. Ich schätze, meine Frage sollte eigentlich lauten, wie man generell mit großen Datenmengen über http umgeht?

2voto

Jacob Proffitt Punkte 12454

Ich denke, dass Sie eher ein konzeptionelles Problem haben als alles andere. "Potenzieller Speicherverbrauch berechnen" steht im Widerspruch zu "Effiziente Berechnung der Größe der einzelnen Chunks". Der einzige Weg zu realmente um die Speichernutzung so genau zu ermitteln, dass Sie die angemessene Größe der Chunks vorhersagen können, müssen Sie eigentlich Ihre Bekehrung vornehmen.

Es klingt so, als ob es am besten wäre, die Sache schrittweise anzugehen - im Wesentlichen das, was diejenigen sagen, die Streaming-Objekte vorschlagen. Wenn Sie nicht tatsächliche Streaming nutzen können, werden Sie wahrscheinlich wollen Ihre Serialisierung zu strukturieren, so dass Sie eine konzeptionelle Einheit zu einer Zeit (d.h. ein Element in Ihrer Liste mit seinen dazugehörigen Wörterbuch Kinder) Fortschritte.

1voto

John Saunders Punkte 159011

Wie schicken Sie es? Sie sollten dies über WCF tun, das Streaming beherrscht. Außerdem können Sie über die Konfiguration festlegen, ob Sie XML oder binäre Daten verwenden möchten.

0 Stimmen

@john. Danke John. Jetzt ist es zu spät, WCF zu implementieren. Wie ich schon @Albert gesagt habe, habe ich diese Situation nicht vorhergesehen, aber ich sehe das Problem jetzt. Vielleicht stelle ich die falsche Frage. Selbst wenn ich Binärdaten verwenden würde, wäre das Problem vielleicht noch zu groß. Ist die Lösung für all diese Probleme Streaming?

0 Stimmen

Ein großer Unterschied zu WCF ist, dass es viel effizienter ist und nicht mehrere Kopien gleichzeitig im Speicher hält. Außerdem ist das Streaming viel einfacher. Ich glaube, ich habe nicht einmal conozca wie man echtes Streaming mit ASMX-Webdiensten durchführt.

0 Stimmen

@john: Danke, John. Also, wenn ich WCF verwenden, und dann streamen, sagen Sie, unabhängig von der Größe, es würde übertragen, weil seine nur Bits zu einer Zeit übertragen? was über Timeout-Probleme, wie lange kann es für Stream? Stunden? Nicht, dass ich eine so große Datenmenge senden würde, aber um der Argumente willen...?

0voto

Stephan Eggermont Punkte 15743

Wenn es ein Problem ist, zu senden, ist es dann nicht auch ein Problem, zu empfangen? Das klingt, als ob Sie versuchen, ein halbes Problem zu lösen. XML ist für große Datenmengen ein absolutes No-Go.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X