SQL CE OutOfMemoryException, потребляющий веб-сервис - PullRequest
1 голос
/ 23 марта 2009

Мы постоянно получаем исключения OutOfMemory при попытке загрузки документов через веб-сервис. Мы храним данные байтового массива документов как часть сериализованного объекта сообщения, и все исходные документы имеют размер ~ 500 КБ. Единственная другая вещь в графе объектов сообщения - это два строковых свойства для корреляции.

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

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

Ответы [ 2 ]

5 голосов
/ 23 марта 2009

Память на устройствах Windows Mobile ОЧЕНЬ тугая - работать с ней по-настоящему мучительно. Прежде всего, ваш общий объем памяти для процесса (если я правильно помню) 32 МБ. Теперь это заполняется не только выделением памяти в коде, но и загрузкой кода из DLL, EXE и т. Д.

Теперь, когда вы загружаете 500KB в байтовый массив, ему не нужно просто 500KB. Ей нужно 500 КБ НЕПРЕРЫВНОЙ ПАМЯТИ, что очень маловероятно найти после короткого запуска приложения.

Я рекомендую загружать файлы напрямую с помощью HttpRequest, а не через веб-службу. Может быть, веб-сервис может передать вам URL, который вам нужен, или что-то в этом роде. Но загрузите файл напрямую, и вы можете обработать его порциями - прочитать 8 КБ, затем записать эти 8 КБ на диск, затем прочитать еще 8 КБ и т. Д.

0 голосов
/ 23 марта 2009

Чтобы получить исключение OutOfMemory, в коде либо есть ошибка, которая потребляет память до тех пор, пока устройства больше не будет, либо устройство обычно не имеет достаточно памяти для обработки даже вариаций 500 КБ.

Вы говорите «при попытке загрузить документы», может быть, вы храните их в памяти и получаете исключение.

...