2013-02-22 3 views
1

У меня есть DataTable, который может содержать сотни тысяч записей. Это огромная нехватка памяти, поэтому я добавил функцию, благодаря которой пользователи могут визуализировать только 200 записей в моем приложении и могут экспортировать остальные результаты в файл CSV.Как работать с очень большими базами данных

Однако для экспорта в CSV-файл метод, который я использую, делает это путем преобразования содержимого файла DataTable в файл CSV. Поскольку в DataTable у меня может быть более 100K записей, я думаю, что слишком большая часть памяти для размещения всех записей в DataTable и сопоставление с CSV-файлом. Какой подход был бы рекомендован? Это код моего CSV-кода:

StringBuilder builder = new StringBuilder(); 

      IEnumerable<string> columnNames = dtResults.Columns.Cast<DataColumn>().Select(column => column.ColumnName); 
      builder.AppendLine(string.Join(",", columnNames)); 

      foreach (DataRow row in dtResults.Rows) 
      { 
       IEnumerable<string> fields = row.ItemArray.Select(field => DisplayCommas(field.ToString())); 
       builder.AppendLine(string.Join(",", fields)); 
      } 

      File.WriteAllText(filename, builder.ToString()); 
+0

сотни тысяч записей являются «умеренными»; не «очень большой». Это касается момента, когда вы начинаете понимать, что вам нужно делать такие вещи, как «сортировка и пейджинг на сервере», а не выбор всего в «DataTable». Какая база данных вы используете здесь? Используете ли вы «базу данных» и «CSV» как синонимы здесь? –

+0

@MarcGravell - Пользователи могут применять мое приложение к любой базе данных по их выбору, поэтому теоретически она может быть такой же большой, как и самая большая доступная база данных (хотя таких случаев было бы очень мало). Пользователи могут использовать мое приложение для запроса своих баз данных и просматривать результаты их запроса в виде DataGrid, который создается из DataTable. Тем не менее я хотел бы экспортировать содержимое DataTable в CSV-файл, однако я беспокоюсь, что могут быть случаи, когда DataTable будет потреблять слишком много памяти –

+2

; и по этой причине «DataTable» очень редко используется за пределами небольших приложений ... –

ответ

0

Как было предложено другими, работать с тяжеловесным DataTable здесь следует избегать с учетом ваших требований. Таким образом, потоковые данные из источника, использующего считыватель данных своего поставщика, позволят вам получить максимальную производительность при сохранении тонкого профиля памяти.

Я сделал несколько быстрых поисков, но не смог придумать какие-либо реализации библиотек csv (есть тонна, далеко от исчерпывающего поиска), которая рекламировала простой plug-n-play с DataReader. Однако было бы довольно тривиально использовать библиотеку CSV (раньше я использовал FileHelpers и kbcsv с успехом), чтобы обрабатывать запись файла, загружать считыватель данных из вашего запроса, сообщать csv записи имена столбцов, прежде чем вы начнете цикл, а затем просто позвольте автору обрабатывать потоки результатов на диск.

Возможно, во время этого может возникнуть некоторое увеличение памяти, так как поток записи файла, вероятно, будет иметь приличный буфер, но это будет способ меньше потребления памяти, чем подход, ориентированный на данные. Единственным недостатком, который я действительно могу видеть от использования datareader с большим набором результатов таким образом, является утечка, которую долгое время может запросить долгосрочный запрос от поставщика данных ADO.NET, но это полностью специфический поставщик (но общая проблема), который вы можете посмотреть, есть ли у вас проблемы на стороне базы данных после того, как вы спуститесь по этому маршруту.

Надеюсь, что это поможет.

0

Я бы пошел в старую школу и использовал sqlcmd. Что-то вроде:

sqlcmd -q "select field1,field2,field3 from mytable" -oc:\output.csv -h-1 -s"," 

http://msdn.microsoft.com/en-us/library/ms162773.aspx

+0

Может ли это использоваться в C#? Кроме того, я также хотел бы экспортировать результаты в XML и Excel - будет ли это решение модифицировать для поддержки этих форматов или это только CSV? –

+0

Вы пренебрегали упоминанием XML или Excel выше. Для XML я бы использовал предложение SELECT FOR XML (http://msdn.microsoft.com/en-us/library/ms178107.aspx). Excel может открывать файлы .csv –

0

канавы DataTable и использовать DataReader. Последовательно читайте нужные вам записи и создавайте CSV-файл по ходу дела.

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