2015-12-09 12 views
9

Ho circa 500K righe Ho bisogno di tornare dal mio database (per favore non chiedere perché: /).È possibile eseguire lo streaming di un set di risultati di database SQL Server di grandi dimensioni utilizzando Dapper?

Io poi necessario salvare questi risultati come XML (più URGH :() e l'ftp questo file da qualche parte magica.

Ho anche bisogno di trasformare l'ogni riga del set di risultati.

in questo momento, questo è quello che sto facendo con dire .. TOP 100 risultati:

  • utilizzando il metodo di Dapper Query<T>, che getta l'intero set di risultati in memoria
  • ho quindi utilizzare AutoMapp er per convertire il database POCO alla mia FileResult POCO
  • Converti in XML
  • quindi salvare questa raccolta per il file system
  • Poi FTP

Questo funziona bene per 100 righe, ma ottengo un Out Di eccezione di memoria con AutoMapper quando si tenta di convertire i risultati di 500K in una nuova raccolta.

Così, mi chiedevo se potevo fare questo ...

  • flusso di dati da DB usando Dapper
  • Per ogni riga, automapper è
  • Convert to XML
  • flusso risultato su disco
  • < ripetizione per ogni riga >
  • Ora FTP che file per magia-land

Sto cercando di smettere di buttare tutto nella RAM. Il mio pensiero è che se riesco a trasmettere materiale, è più efficiente in termini di memoria poiché lavoro solo su un singolo set di dati di risultati.

Qualcuno può aiutare?

+0

Date un'occhiata qui: http://stackoverflow.com/questions/12697509/questo-segue-il-buffered-parameter-do-in-dapper-dot-net – Rob

risposta

7

utilizzando il metodo di Dapper Query<T>, che getta l'intero set di risultati in memoria

Si tratta di un buon lavoro, quindi, che uno dei parametri opzionali è un bool che consente di scegliere se tampone o not; p

Basta aggiungere , buffer: false alla chiamata esistente a Query<T>.

+0

come questo cambia il codice che esegue questo ' Query /QueryAsync '? Se non è il buffering, come faccio a estrarre i dati ed elaborarli riga per riga? o c'è un altro trucco? –

+0

@ Pure.Krome in entrambi i casi, si * basta 'foreach' sui dati * - si tratta di un blocco iteratore sul lettore aperto.Nota: se non vuoi usare 'foreach', allora usi semplicemente' GetEnumerator() ',' MoveNext() '(controllando il valore restituito) e' Current' (ricordando di disporre l'enumeratore alla fine); 'foreach (var x in y) {...}' è in pratica: 'using (var iter = y.GetEnumerator()) {while (iter.MoveNext()) {var x = iter.Current; ...}} ' –

Problemi correlati