Да, использование DataSets использует намного больше памяти, чем фактические данные. Сколько трудно определить количественно, но этот вопрос о StackOverflow предлагает более чем в 4 раза превышать исходный размер данных. Давайте предположим, что это правильно. 150 МБ данных раз 4 = 600 МБ памяти. Когда приложение ASP.NET использует около 800 МБ ОЗУ, оно начинает выдавать исключения OutOfMemoryException. Я не уверен, как этот предел совпадает с пределом памяти пула приложений. Вы пробовали / 3GB переключатель в boot.ini? (См. эту статью для получения инструкций)
Также обратите внимание, что если вы сериализуете свой DataSet, сериализатор может выделять огромные буферы для сериализации (до 10 раз больше исходного размера, см. эту статью . Вы указываете, что проблема возникает при чтении данные, так что это, вероятно, не является причиной вашей ошибки (но это может быть, если вы решите ошибку нехватки памяти и попытаетесь отправить данные по проводам).
Мой опыт работы с DataSets вначале может показаться хорошей идеей, но вы очень скоро столкнетесь с проблемами.
Другим (возможно, лучшим) решением было бы использование DataReader и чтение по одной строке за раз. Верните пакеты строк (т. Е. Используйте какую-то подкачку для данных) и поэкспериментируйте с размером каждой партии, чтобы найти точку соприкосновения между производительностью и использованием памяти. Потоковая передача WCF может помочь, но вам необходимо правильно настроить WCF, чтобы он мог возвращать такие огромные объемы данных за один вызов.