Как правило, .NET ограничивается адресацией 2 ГБ памяти в одной коллекции или другом объекте.Это связано с тем, что даже в 64-разрядной среде индексаторы используют 32-разрядные целые числа (с максимальным значением 2 миллиарда и изменением).Даже для простых типов данных, таких как целые числа, размер одного целого означает, что в одном массиве может храниться только 500 миллионов целых.Для более крупных типов значений, таких как структуры, максимальное количество элементов коллекции становится действительно небольшим.
Если вы работаете в 32-битной среде, такой как Windows XP, существуют даже более низкие пределы;максимальный объем памяти для ВСЕЙ ПРОГРАММЫ не может превышать 2 ГБ.Это накладывает некоторые довольно высокие ограничения на ETL, подобный вашему, и я совсем не удивлюсь тому, что вашей программе не хватает памяти, пытающейся обработать 67k записей в памяти за один раз.
Решение состоит в том, чтобы обрабатыватьзаписи небольшими партиями, если можете.Попробуйте построить оператор на основе идентификатора, в котором вы возвращаете первые 100 записей, где идентификатор (возможно, автоматически сгенерированный) превышает самый большой идентификатор, который вы уже получили.Как только запись обработана, утилизируйте ее (или просто осиротьте и дайте GC выполнить свою работу).