Не рекомендуется использовать DataTable для 1 М строк, вы можете просто создать новый SqlComand для INSERT, сделать все поля таблицы параметрами и запустить эту команду в цикле.
Но если вы уже написали много кода с помощью DataTable, вы можете рассматривать его как буфер и иметь следующий обходной путь:
1) насколько вы читаете строки данных, проверьте, сколько уже прочитано
2) как только вы получите 10K строк, вы выполняете DataTable.Update ();
(вы можете вызвать этот параметр как buffer_size и поместить куда-нибудь в конфигурацию, чтобы избежать жесткого кодирования)
3) затем вы очищаете все данные в DataTable, вызывая
DataTable.Clear();
DataTable.AcceptChanges();
4) вы продолжаете читать данные из файла, цикл повторяется
Кроме того, сложно сделать общие предложения, не зная структуры вашего файла и цели приложения, я только ответил на вопрос, как избежать «нехватки памяти» при использовании очень больших наборов данных. Но я также рекомендую рассмотреть все возможные варианты, чтобы избежать использования таблиц данных .NET в качестве промежуточного хранилища данных и файлов процесса напрямую всеми возможными средствами, предоставляемыми сервером SQL, такими как
1) БОЛЬШАЯ ВСТАВКА - http://msdn.microsoft.com/en-us/library/ms188365.aspx
2) утилита bcp - http://msdn.microsoft.com/en-us/library/ms162802.aspx
3) Службы MS SQL Intergartion - http://msdn.microsoft.com/en-us/library/ms141026.aspx
Операции массовой вставки с использованием любой из этих команд и инструментов можно инициировать из .NET.