2015-12-09 3 views
9

У меня около 500K строк Мне нужно вернуться из моей базы данных (пожалуйста, не спрашивайте, почему: /).С помощью Dapper можно передать большой набор данных базы данных SQL Server?

Я тогда необходимо сохранить эти результаты как XML (более Urgh :() и фтп этот файл где-то магическое.

мне нужно преобразовать каждую строку в наборе результатов.

Прямо сейчас, это то, что я делаю с скажем .. TOP 100 результатов:

  • с использованием методы Query<T> щеголеватой, которая бросает все набор результатов в память
  • затем я использую AutoMapp эр, чтобы преобразовать базу данных POCO к моему FileResult POCO
  • Пересчитать в XML
  • Затем сохраните эту коллекцию в файловой системе
  • Затем FTP

Это прекрасно работает на 100 строк, но я получаю Out Исключение памяти с AutoMapper при попытке преобразовать результаты 500K в новую коллекцию.

Итак, мне было интересно, смогу ли я это сделать ...

  • потока данных, из БД с помощью Щеголеватый
  • Для каждой строки, automapper это
  • Преобразовать в XML
  • поток результат на диск
  • < повтор для каждой строки >
  • Теперь FTP этот файл в волшебном-земля

Я пытаюсь прекратить бросать все в оперативную память. Я думаю, что если я смогу потопить материал, он будет более эффективным с точки зрения памяти, поскольку я работаю только с одним результирующим набором данных.

Может ли кто-нибудь помочь?

+0

Посмотрите здесь: http://stackoverflow.com/questions/12697509/what-does-the-buffered-parameter-do-in-dapper-dot-net – Rob

ответ

7

использованием Query<T> метода щеголеватый, которая бросает весь набор результатов в память

Это хорошая работа, то, что один из дополнительных параметров является bool, который позволяет выбрать, будет ли буфер или not; p

Просто добавьте , buffer: false в ваш существующий звонок до Query<T>.

+0

Как это изменить код, который выполняет этот ' Запрос /QueryAsync '? Если это не буферизация, то как я извлекаю данные и обрабатываю их по строкам? или есть еще трюк? –

+0

@ Pure.Krome в обоих случаях, вы * просто 'foreach' над данными * - это блок итератора над открытым считывателем.Примечание: если вы не хотите использовать 'foreach', тогда вы просто используете' GetEnumerator() ',' MoveNext() '(проверяя возвращаемое значение) и' Current' (помня, что нужно переустановить перечислитель в конце); 'foreach (var x in y) {...}' в основном: 'using (var iter = y.GetEnumerator()) {while (iter.MoveNext()) {var x = iter.Current; ...}} ' –

Смежные вопросы