2015-12-09 5 views
9

Ich habe etwa 500K Zeilen, die ich aus meiner Datenbank zurückgeben muss (bitte fragen Sie nicht warum: /).Es ist möglich, eine große SQL Server-Datenbank Ergebnismenge mit Dapper?

Ich werde dann müssen diese Ergebnisse als XML (mehr URGH :() und der ftp Diese Datei irgendwo magisch speichern.

Ich brauche auch die jede Zeile in der Ergebnismenge zu transformieren.

Im Moment ist es das, was ich tue, mit sagen .. TOP 100 Ergebnisse:

  • mit Query<T> Methode des Dapper, die das gesamte Ergebnis wirft gesetzt in den Speicher
  • ich dann verwenden AutoMapp er die Datenbank POCO meinem Fileresult POCO
  • Umrechnen in XML konvertieren
  • Dann diese Sammlung in die Systemdatei speichern
  • Dann FTP

Dies funktioniert gut für 100 Zeilen, aber ich erhalte eine Out Von Memory-Ausnahme mit AutoMapper beim Versuch, die 500K-Ergebnisse in eine neue Sammlung zu konvertieren.

Also, ich frage mich, wenn ich dies tun könnte ...

  • Stream-Daten von DB mit Dapper
  • Für jede Zeile, AutoMapper es
  • Convert
  • Stream XML Ergebnis auf Platte
  • < Wiederholung für jede Zeile >
  • ftp nun diese Datei Magie-Land

Ich versuche alles in den RAM zu stoppen werfen. Mein Gedanke ist, dass wenn ich Streams streamen kann, es speichereffizienter ist, da ich nur an einem einzelnen Ergebnissatz von Daten arbeite.

Kann jemand helfen?

+0

Werfen Sie einen Blick hier: http://stackoverflow.com/questions/12697509/what-does-the-buffered-parameter-do-in-dapper-dot-net – Rob

Antwort

7

Dapper des mit Query<T> Verfahren, das die gesamte Ergebnismenge in dem Speicher wirft

Es ist eine gute Arbeit, dann, dass eine der optionalen Parameter ein bool ist, dass Sie, ob wählen kann, puffern oder p

Fügen Sie einfach , buffer: false zu Ihrem bestehenden Anruf zu Query<T> hinzu.

+0

Wie ändert dies den Code, der dies ausführt ' Anfrage /QueryAsync '? Wenn es nicht gepuffert wird, wie kann ich Daten herausziehen und Zeile für Zeile verarbeiten? oder gibt es noch einen Trick? –

+0

@ Pure.Krome in beiden Fällen, Sie * nur 'foreach' über die Daten * - es ist ein Iterator-Block über den offenen Leser.Hinweis: Wenn Sie 'foreach' nicht verwenden möchten, verwenden Sie einfach' GetEnumerator() ',' MoveNext() '(Überprüfen des Rückgabewertes) und' Current' (Denken Sie daran, den Enumerator am Ende zu platzieren); 'foreach (var x in y) {...}' ist im Grunde: 'using (var iter = y.GetEnumerator()) {while (iter.MoveNext()) {var x = iter.Current; ...}} ' –

Verwandte Themen