OutOfMemoryException - набор данных ‹-› XML ‹-› Набор данных

Я застрял в огромной проблеме, когда мне нужно обрабатывать огромные данные.

Я получаю набор данных с 5 таблицами данных. В одной из таблиц около 3000 столбцов и 50 000 записей.

Мне нужно полностью сохранить этот набор данных в базе данных SQL как XML, и мне нужно получить его позже.

Я НЕ МОГУ вносить какие-либо изменения в дизайн, чтобы пропустить это. Когда я делаю dataset.GetXml (), он возвращает строку огромной длины, которая выдает OutOfMemoryException. Я знал, что строковый тип данных имеет определенный предел для передачи данных.

Но в таблице sql столбец xml может содержать до 2 ГБ. Итак, как я могу перемещать этот набор данных между базой данных и моим приложением?

Спасибо

NLV


person NLV    schedule 19.04.2010    source источник


Ответы (3)


Ваш дизайн звучит некорректно. Зачем нужно извлекать всю таблицу в память? Вместо этого пролистайте его - работайте с таблицей меньшими партиями - скажем, 1000 записей за раз.

Возможно, вам даже не нужно этого делать. Как правило, приложения баз данных работают только с изменяющимися данными. Если вашему приложению необходимо изменить 10 строк, извлеките только эти десять строк. Вы сэкономите не только память, но и все время, необходимое для извлечения и публикации этих данных.

3000 столбцов в таблице? Это тоже (действительно) плохо пахнет. Посмотрите на нормализацию вашей базы данных.

Я знаю, что легче решить неотложную проблему и двигаться дальше. Однако в долгосрочной перспективе у вас будет намного меньше проблем, если вы исправите (откровенно говоря, довольно серьезные) проблемы дизайна заранее.

person Michael Petrotta    schedule 19.04.2010
comment
3000 колонок! Когда я это читала, у меня сильно разболелась шея и спина! Добрый человек горе! - person Buggabill; 19.04.2010
comment
Я понимаю все ваши комментарии. У меня есть основная сетка данных в моем приложении, к которой привязан набор данных. Таким образом, таблица sql не имеет 3000 столбцов. Большинство из них - динамические столбцы. Кроме того, в каждой строке есть множество столбцов, которые можно редактировать. Моя цель - сохранить изменения, которые он внес, когда он снова откроет приложение. Это расплывчатое приложение с 3000 столбцами в сетке. Я не знаю, что собирается делать клиент, имея все в одном месте. Но это требование! - person NLV; 19.04.2010
comment
Это еще хуже. Как пользователь должен обрабатывать 3000 столбцов в одной сетке? Если у вас вообще есть влияние, нажмите, чтобы изменить требование. Используйте эту проблему как рычаг, потому что, если вам нужно полностью отключиться от базы данных во время представления всех этих данных, у вас, вероятно, будут проблемы с памятью, что бы вы ни делали. - person Michael Petrotta; 19.04.2010
comment
Мне удалось разбить весь набор данных на несколько подтаблиц, и я сохранил его в 30 столбцах XML в базе данных. Дело в том, что я не могу преобразовать эти xml в datatable. Я использовал xmldatadocument, чтобы получить xml и сохранить его в базе данных. Но я не могу перечитать этот xml как datatable. У меня отсутствует корневой элемент, недопустимые символы и т. Д. При попытке преобразовать это. Любые идеи? - person NLV; 19.04.2010
comment
Опубликуйте свой XML и код, использованный для его чтения. Это, наверное, требует отдельного вопроса. Не пишите в комментариях - здесь не работает код и форматирование XML. - person Michael Petrotta; 19.04.2010

Вам нужно будет переключиться на все API, которые включают потоковую передачу, использовать SqlDataReader (по 1 строке за раз), а не DataSet. Кроме того, по возможности передавайте данные во временные файлы в файловой системе вместо того, чтобы хранить их в памяти.

Если одной строки слишком много для хранения, вероятно, вам нужно использовать потоковые API-интерфейсы, чтобы общаться с большими двоичными объектами в соответствующих больших столбцах.

person MatthewMartin    schedule 19.04.2010

3k столбцов x 50k строк = 150 миллионов элементов перед тем, как вы начнете. Сколько символов в элементе?

Я должен спросить ... почему вы используете базу данных для хранения этого? Вы также можете сохранить его на файловом сервере.

50 тыс. Строк - это крошечные, но 3 тыс. Столбцов - это крайность, и все это сильно раздуто в XML.

person gbn    schedule 19.04.2010
comment
Я не могу сохранить его в локальном файле, так как это многопользовательское приложение. - person NLV; 19.04.2010
comment
Я думаю, вы хотели сказать, что 3k столбцов - это крайность - надеюсь, вы не против, чтобы я это исправил. :) - person Aaronaught; 19.04.2010
comment
@NLV: из-за того, что вам понадобится время для обработки этих данных в движке БД, в любом случае это один пользователь ... - person gbn; 19.04.2010