Ваш существующий код слишком сложен. Если это все, что вы делаете, то использование таблицы данных не нужно / неразумно; это один из немногих случаев, когда я бы рекомендовал использовать низкоуровневый считыватель данных для поддержания низкого уровня воздействия на память
Запись таблицы в файл в файл, быстрое, простое и низкое потребление памяти:
Dim dr = sqlCommand.ExecuteReader()
Dim sb as New StringBuilder
Dim lineNum = -1
Dim batchSize = 100
While dr.Read()
'turn the row into a string for our file
For x = 0 to dr.FieldCount -1
sb.Append(dr.GetString(x)).Append(",")
Next x
sb.Length -= 1 'remove trailing comma
sb.AppendLine()
'keep track of lines written so we can batch accordingly
lineNum += 1
Dim fileNum = lineNum \ batchSize
File.AppendAllText($"c:\temp\file{fileNum}.csv", sb.ToString())
'clear the stringbuilder
sb.Length = 0
End While
Если вы действительно хотите использовать таблицу данных, ничто не мешает вам поменять это while dr
на For Each r as DataRow in myDatatable.Rows
Обратите внимание, что это не упражнение в создании полностью экранированного CSV, ни форматирование данных; он демонстрирует концепцию наличия пожарного шланга данных и простой записи его в N различных файлов, используя тот факт, что деление целого числа на каждое число от 0 до 99 приведет к 0 (и, следовательно, go в файле 0) и тогда само число от 1 до 199 приведет к 1 (и, следовательно, к строкам go в файле 1) et c и выполнению этого процесса в одном потоке данных или в одной итерации из N элементов
Вы можете построить строки файла в конструкторе строк и записывать их каждый batchSize if lineNum Mod batchSize = batchSize - 1
, если вы чувствуете, что это будет более эффективно, чем вызов файла appendalltext (который открывает и закрывает файл)