Web-Service-Out-of-Memory-Ausnahme beim ausfüllen ADO.Net DataSet
1) ClientApp macht async-Aufruf ASP.Net 2.0 WebService
2) Web-service-Aufrufe zu SQL Server 2005 stored procedure
3) Gespeicherte Prozedur gibt die Daten Ausgang, 150MB Tabelle
Out-of-Memory-Ausnahme wird ausgelöst, indem Sie DataAdapter.Fill(...) beim Versuch, mehr Speicher zuzuweisen, für neue Zeilen.
IIS-Anwendungspool verfügt nicht über eine Max Memory-Beschränkungen auf Sie.
Gibt es maximale Speicher-Auslastung Kappen set irgendwo sonst auf IIS-Ebene?
Kostet ein 150MB db-Tabelle, die nehmen viel mehr Platz beim Einlesen in den Speicher, wie ein DataSet?
Gibt es ein Szenario (mit WCF (vielleicht), wo das Ergebnis des Verfahrens nie hat sich in web-server-Speicher würde aber gestreamt werden direkt auf den client?
Ich würde es vorziehen, nicht zu haben, um teilen Sie die Anfrage in kleinere Datensätze, da der client Sie anfordert asynchron. Sie sammeln alle Teile müsste passieren asynchron auch, und jeder client müsste implementieren von asynchronen Sammlung für jeden Anruf.
Irgendwelche Vorschläge, Empfehlungen oder Tipps würde geschätzt.
- Paar Fragen. 1) ist diese gehostet wird auf 32-bit-version von Windows Server? 2) wie groß ist der Application-Pool worker-Prozess, wenn es abstürzt?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja, verwenden von DataSets benötigt wesentlich mehr Speicher als die eigentlichen Daten. Wie viel ist schwer zu quantifizieren, aber diese Frage auf StackOverflow schlägt vor, mehr als das 4-fache der ursprünglichen Größe der Daten. Lassen Sie uns annehmen, das ist richtig. 150MB Daten mal 4 = 600MB Speicher. Wenn ASP.NET -Anwendung verwenden, um 800MB RAM Sie beginnen zu werfen OutOfMemoryExceptions. Ich bin mir nicht sicher, wie das, limit ist die gleiche wie die Anwendung Pool-Speicher zu begrenzen. Haben Sie versucht, die Option /3GB in boot.ini? (Siehe dieser Artikel für Anweisungen)
Beachten Sie auch, dass, wenn Sie serialisieren DataSet, das Serialisierungsprogramm belegen können, große Puffer für die Serialisierung (bis zu 10-fache der ursprünglichen Größe, siehe dieser Artikel. Sie zeigen, dass das problem Auftritt, wenn Sie die Daten Lesen, so ist dies wahrscheinlich nicht die Ursache Ihrer Fehler (aber es könnte sein, wenn Sie lösen die out-of-memory-Fehler, und versuchen Sie das senden der Daten über den Draht).
Meine Erfahrung mit Datensätzen ist, dass Sie mag wie eine gute Idee auf den ersten, aber Sie werden sehr bald auf Probleme stoßen.
Andere (wahrscheinlich bessere) Lösung wäre die Verwendung von DataReader-Objekt und Lesen eine Zeile zu einem Zeitpunkt. Rückkehr Chargen-Zeilen (d.h. Art von verwenden der paging-Funktion für die Daten) und Experimentieren Sie mit der Größe der jeweiligen charge zu finden, die sweet-spot zwischen performance und Speicherbedarf. WCF streaming könnte den trick tun, aber Sie müssen zum konfigurieren von WCF-richtig, damit es wieder so riesige Mengen an Daten in einem Aufruf.
Die besten Praktiken wäre a) nicht wieder so viel Daten, und b) mit WCF statt vier Jahre alte Technologie (ASMX web services).