OutOfMemoryException - Набор данных <-> XML <-> Набор данных - PullRequest
0 голосов
/ 19 апреля 2010

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

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

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

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

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

Спасибо

NLV

Ответы [ 3 ]

4 голосов
/ 19 апреля 2010

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

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

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

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

1 голос
/ 19 апреля 2010

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

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

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

все это сильно раздуто
1 голос
/ 19 апреля 2010

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

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

...