Большие XML-файлы в наборе данных (вне памяти) - PullRequest
3 голосов
/ 19 апреля 2010

В настоящее время я пытаюсь загрузить немного большой XML-файл в набор данных. Размер файла xml составляет около 700 МБ, и каждый раз, когда я пытаюсь прочитать xml, ему требуется много времени, а через некоторое время выдается исключение «недостаточно памяти».

DataSet ds = new DataSet();
ds.ReadXml(pathtofile);

Основная проблема заключается в том, что мне необходимо использовать эти наборы данных (я использую его для импорта данных из файла XML в базу данных Sybase (таблица foreach, строка foreach, столбец foreach)) и что у меня нет схемы файл.

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

Дополнительная информация: Я использую базу данных Sybase (ASA 9), но мое приложение на C # падает перед тем, как обрабатывать базу данных. Ошибка происходит после того, как я прочитал XML в набор данных и хочу работать с ds. Я уже читал, что это известная ошибка при использовании наборов данных с большим содержанием. Мне нужны данные в наборе данных хотя бы один раз, потому что мне нужно импортировать их в базу данных.

Ответы [ 3 ]

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

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

Вот код:

DataSet ds = new DataSet();
FileStream filestream = File.OpenRead(pathtofile);
BufferedStream buffered = new BufferedStream(filestream);
ds.ReadXml(buffered);

С размером данных, о которых вы говорите, сам набор данных может быть ограничен в памяти. Часть проблемы с XML заключается в том, что он может взять 500 КБ данных и превратить их в 500 МБ просто из-за плохого выбора имени элемента и глубины вложения. Так как у вас нет схемы, вы можете замкнуть ограничение памяти, прочитав файл, как указано выше, и просто заменить имена элементов на более короткие версии (например, замените <Version></Version> на <V></V> для уменьшения байтов> 60%).

Удачи, и я надеюсь, что это поможет!

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

Вам нужно найти способ «лениво» читать XML-файл, а не помещать его в память сразу.

эта статья показывает, как читать элемент файла XML по элементу http://support.microsoft.com/kb/307548

Я бы предложил взять этот пример и изменить его для выполнения вашей задачи.

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

Нам понадобится немного больше, я думаю. Какие программы вы используете? Какая база данных? Сбой C # или база данных? Или твой браузер?

Основным решением было бы дать части, которая выбрасывает исключение нехватки памяти (я думаю, это ваше приложение C #) больше памяти с параметром. По крайней мере, это то, что я бы сделал, если бы это была программа на Java.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...